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>

私は今、名前を探してcustomerIdvalue.

ほとんど機能しますが、ドキュメント内のすべての値を置き換えます。名前が一致した場所の値を置き換えるだけで、何が間違っていますか?

.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 に答える