如果我有一个带有命名空间的 xml,并且想要应用一些值替换,我需要更改什么? http://xslt.online-toolz.com/tools/xslt-transformation.php
<?xml version="1.0"?>
<accounts>
<account>
<name>Alex</name>
</account>
<account>
<name>Fiona</name>
</account>
</accounts>
这会将所有名称值更改为“Johndoe”:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="account/name/text()">
<xsl:text>JohnDoe</xsl:text>
</xsl:template>
</xsl:stylesheet>
但是如果我在标签之前有一个命名空间怎么办,例如:
<?xml version="1.0"?>
<my:accounts>
<my:account>
<my:name>Alex</my:name>
</my:account>
<my:account>
<my:name>Fiona</my:name>
</my:account>
</my:accounts>
最佳答案
有两种方法可以做到这一点。在样式表标记中包含“my”命名空间,如下所示:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="(insertnamespacehere)">
然后做
<xsl:template match="my:account/my:name/text()"
>
或者做更笨拙的事情:
<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">
我倾向于不鼓励后一种方法 - 命名空间的存在是为了通过使用 employee:name
来区分具有相同本地名称的元素(例如 company:name
和 local-name()
)。你忽略了这个区别。换句话说,如果您的文档恰好包含 foo:account/foo:name
,您也会意外地替换它。
顺便说一句,您的最后一个示例 XML 无效 - my
命名空间未声明。你的根my:accounts
需要将其包含在 <my:accounts xlmns:my="(insertnamespacehere)">
中
关于java - 用命名空间替换 XSLT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13723406/