为什么这个xslt转换会替换所有出现的?

时间:2012-12-06 10:35:35

标签: java xml xslt-2.0

使用http://xslt.online-toolz.com/tools/xslt-transformation.php

.XML

<?xml version="1.0"?>
<my:project xmlns:my="http://myns">
<my:properties>
 <my:property>
  <my:name>customerId</my:name>
  <my:value>1</my:value>
 </my:property>
 <my:property>
  <my:name>userId</my:name>
  <my:value>20</my:value>
 </my:property>
</my:properties>
</my:project>

我现在想要查找名称customerId,并希望替换value

它几乎可以工作,但它取代了文档中的所有值。我只是替换名称匹配的值,我做错了什么?

的.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:my="http://myns" xmlns:saxon="http://saxon.sf.net"> 

 <xsl:param name="name" select="'customerId'"/>
 <xsl:param name="value" select="'0'"/>

  <xsl:template match="node() | @*">
    <xsl:copy>
      <xsl:apply-templates select="node() | @*"/>
    </xsl:copy>
 </xsl:template>

 <xsl:template match="/*/my:properties/my:property/my:value/text()" > 
   <xsl:choose>
     <xsl:when test="/*/my:properties/my:property/my:name = $name">
        <xsl:value-of select="$value"/>
     </xsl:when>
     <xsl:otherwise><xsl:copy-of select="saxon:parse(.)" /></xsl:otherwise>
   </xsl:choose>
 </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

/*/my:properties/my:property/my:name = $name的测试总是成功,因为它使用绝对路径,因此结果独立于周围的模板上下文。具有相对xpath的测试应该有效。

XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:my="http://myns" xmlns:saxon="http://saxon.sf.net"> 

    <xsl:param name="name" select="'customerId'"/>
    <xsl:param name="value" select="'0'"/>

    <xsl:template match="node() | @*">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/*/my:properties/my:property/my:value/text()" > 
        <xsl:choose>
            <xsl:when test="../../my:name = $name">
                <xsl:value-of select="$value"/>
            </xsl:when>
            <xsl:otherwise>otherwise</xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

XML:

<my:project xmlns:my="http://myns">
    <my:properties>
        <my:property>
            <my:name>customerId</my:name>
            <my:value>1</my:value>
        </my:property>
        <my:property>
            <my:name>userId</my:name>
            <my:value>20</my:value>
        </my:property>
    </my:properties>
</my:project>

saxonb-xslt -s:test.xml -xsl:test.xsl

的结果
<my:project xmlns:my="http://myns">
    <my:properties>
        <my:property>
            <my:name>customerId</my:name>
            <my:value>0</my:value>
        </my:property>
        <my:property>
            <my:name>userId</my:name>
            <my:value>otherwise</my:value>
        </my:property>
    </my:properties>
</my:project>