1

私は XSLT にあまり詳しくありません。

基本的に、元の XML には項目の配列があり、次のようになります。

サンプル入力ドキュメント

<Items>
    <Items>Item1</Items>
    <Items>item2</Items>
    <Items>Item3</Items>
</Items>

サンプル入力からの予期される出力ドキュメント

<Items>
    <Items>
        <Item1>Y</Item1>Item1</Items>
    <Items>
        <Item1 />item2</Items>
    <Items>
        <Item1 />Item3</Items>
</Items>

XSLT を使用してそれぞれをチェックし、変更された XML のフィールド内にシンボルItemsを挿入しYたり、そのような項目が見つからない場合はフィールドを空白のままにしたりするにはどうすればよいですか?

私は今このようなものを持っていますが、それが適切な方法であるかどうかはわかりません

      <xsl:if test="Items='Item1'">
        <Item1>Y</Item1>
      </xsl:if>
      <xsl:if test="Items!='Item1'">
        <Item1></Item1>
      </xsl:if>
4

1 に答える 1

1

明示的な条件付き XSLT 命令を使用する必要はありません。テンプレートとテンプレート パターンはあなたの友達です。

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

 <xsl:template match="Items[not(*)]/text()[. = 'Item1']">Y</xsl:template>

 <xsl:template match="Items[not(*)]/text()" priority="0"/>
</xsl:stylesheet>

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

<Items>
    <Items>Item1</Items>
    <Items>item2</Items>
    <Items>Item3</Items>
</Items>

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

<Items>
   <Items>Y</Items>
   <Items/>
   <Items/>
</Items>

説明:

  1. アイデンティティ ルールは、実行のために選択されたすべてのノードを「そのまま」コピーします。

  2. オーバーライドするテンプレートが 2 つあります。1 つは のテキスト ノードの子でItems、値が「Item1」(「置換」) で、2 番目は の他のテキスト ノードの子であり、Itemsボディが空であるため「削除」します。 .

  3. 「削除」テンプレートのpriority属性は、「置換」テンプレートとの優先順位の競合を明示的に解決するために、低く (ゼロに) 設定されています。

于 2012-08-01T02:07:17.663 に答える