用命名空间替换XSLT?

时间:2012-12-05 12:36:42

标签: java xml 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 个答案:

答案 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:namecompany:name),使用{{1你忽略了这种区别。换句话说,如果您的文档恰好包含local-name(),那么您也会意外地替换它。

顺便提一下,您的上一个示例XML无效 - 未声明foo:account/foo:name命名空间。您的根my需要在my:accounts

中包含此内容