9

非常に単純であるように思われることをしようとしていますが、それを機能させることができず、多くの無関係なことを含まない例を見つけることができないようです. 特定の xml タグのテキスト コンテンツを特定の値に更新したい (パラメーターとして渡されます。この XSLT は ant から使用されます)。簡単な例:

変身したい

<foo>
  <bar>
    baz
  </bar>
</foo>

<foo>
    <bar>
        something different
    </bar>
</foo>

これは私が試したスタイルシートです。結果はタグだけで、テキストはまったくありません

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- identity transformation, to keep everything unchanged except for the stuff we want to change -->
    <!-- Whenever you match any node or any attribute -->
    <xsl:template match="node()|@*">
        <!-- Copy the current node -->
        <xsl:copy>
            <!-- Including any attributes it has and any child nodes -->
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- change the text of the bar node, in the real template the value won't be specified inline -->
    <xsl:template match="/foo/bar/">
        <xsl:param name="baz" value="something different"/>
            <xsl:value-of select="$baz"/>
    </xsl:template>
</xsl:stylesheet>

前もって感謝します!

4

3 に答える 3

15

提供されたコードには、コンパイル時のエラーにつながる多くの問題があります。

<xsl:template match="/foo/bar/"> 
    <xsl:param name="baz" value="something different"/> 
        <xsl:value-of select="$baz"/> 
</xsl:template>
  1. このテンプレートで指定された一致パターンは構文的に正しくありません。XPath 式は/文字で終わることはできません。

  2. xsl:paramのような不明な属性を持つことはできませんvalue

解決策:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pReplacement" select="'Something Different'"/>

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

 <xsl:template match="foo/bar/text()">
  <xsl:value-of select="$pReplacement"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<foo>
  <bar>
    baz
  </bar>
</foo>

必要な正しい結果が生成されます。

<foo>
   <bar>Something Different</bar>
</foo>
于 2012-05-03T11:47:04.877 に答える
0

少し異なるアプローチ:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:param name="replace"/>

  <xsl:template match="node()|@*">
    <xsl:choose>
      <xsl:when test="text() and name(..)='bar' and name(../..)='foo'">
        <xsl:value-of select="$replace"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

于 2012-05-03T11:51:40.260 に答える
-1
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
  version="1.0">
<xsl:output indent="yes" encoding="UTF-8" method="xml"/>
<xsl:param name="param-from-ant" as="xs:string"/>

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

<xsl:template match="/foo/bar">
 <xsl:value-of select="$param-from-ant"/>
</xsl:template>
</xsl:stylesheet>
于 2012-05-03T11:36:06.087 に答える