2

他の要素の値に基づいて特定の要素を削除するために使用しているスタイルシートがあります。しかし、それは機能していません...

サンプル入力XML

<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
<Text>Testing</Text>
<Status>Ok</Status>
</Model>

操作値が「ABC」の場合、XMLからテキストノードとステータスノードを削除します。そして、次の出力を提供します。

<Model>
<Year>1999</Year>
<Operation>ABC</Operation>
</Model>

これが私が使用しているスタイルシートですが、操作が「ABC」でない場合でも、すべてのXMLからテキストノードとステータスノードが削除されています。

<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:variable name="ID" select="//Operation"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="Text | Status">
    <xsl:if test ="$ID ='ABC'">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

前もって感謝します

名前空間が次のように存在する場合、どうすれば同じことができますか

<ns0:next type="Sale" xmlns:ns0="http://Test.Schemas.Inside_Sales">
4

4 に答える 4

5

これが完全なXSLT変換です-短くて単純です(変数なしxsl:if、なしxsl:choose、、、、):xsl:whenxsl:otherwise

<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=
 "*[Operation='ABC']/Text | *[Operation='ABC']/Status"/>
</xsl:stylesheet>

この変換が提供されたXMLドキュメントに適用される場合

<Model>
    <Year>1999</Year>
    <Operation>ABC</Operation>
    <Text>Testing</Text>
    <Status>Ok</Status>
</Model>

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

<Model>
   <Year>1999</Year>
   <Operation>ABC</Operation>
</Model>
于 2012-05-17T04:24:29.717 に答える
4

xsl:if次のように変更します。

<xsl:if test="../Operation!='ABC'">

そして、あなたはを取り除くことができますxsl:variable

于 2012-05-17T00:26:15.980 に答える
3

XSLTで使用するよりも優れたパターンは<xsl:if>、一致条件を持つ新しいテンプレートを追加することです。

<xsl:template match="(Text | Status)[../Operation != 'ABC']"/>
于 2012-05-17T03:42:00.660 に答える
2

私はこれがうまくいくことを発見しました:

<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="/Model">
      <xsl:choose>
        <xsl:when test="Operation[text()!='ABC']">
            <xsl:copy>
                <xsl:apply-templates select="node()|@*"/>
            </xsl:copy>
        </xsl:when>
        <xsl:otherwise>
            <xsl:copy>
                <xsl:apply-templates select="Year"/>
                <xsl:apply-templates select="Operation"/>
            </xsl:copy>
        </xsl:otherwise>
      </xsl:choose>
  </xsl:template>
</xsl:stylesheet>
于 2012-05-17T00:31:53.133 に答える