如果我有一个带有命名空间的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>
答案 0 :(得分:2)
这样做的两种方法。在样式表标记中包含'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()"
&GT;
或做得相当笨拙:
<xsl:template match="*[local-name()='account']/*[local-name()='name']/text()">
我倾向于阻止后一种方法 - 存在名称空间以区分具有相同本地名称的元素(例如employee:name
和company:name
),使用{{1你忽略了这种区别。换句话说,如果您的文档恰好包含local-name()
,那么您也会意外地替换它。
顺便提一下,您的上一个示例XML无效 - 未声明foo:account/foo:name
命名空间。您的根my
需要在my:accounts