1

如果我有一个带有命名空间的 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>
4

1 回答 1

2

有两种方法可以做到这一点。在样式表标签中包含“我的”命名空间,如下所示:

<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)">

于 2012-12-05T12:52:24.580 回答