用名称空间替换java XSLT?
如果我有一个带有名称空间的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>
# 1 楼答案
有两种方法。或者在样式表标记中包含“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)">
中包含这个