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>
4

1 回答 1

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>
于 2012-12-06T11:07:58.827 回答