1

これが私のサンプルドキュメントです

<a >
 <b flag='foo'>
 <c/>
 <d/>
 </b>
</a>

bのフラグ属性が「bar」の場合にのみ「c」要素を削除しようとしています。つまり、flag ='foo'の場合、「c」要素は削除しないでください。現在、PCにxslデバッグツールがなく、xsltエラー情報を表示するオンラインツールを見つけることができず、 http ://xslttest.appspot.com/で次のテストxsl変換を実行しています。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
<xsl:output method="xml" indent="yes" version="1.0" encoding="ISO-8859-1"/>
    <!--Identity template to copy all content by default-->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:choose>
    <xsl:when test="/a/b[@flag='bar']">
    <xsl:template match="/a/b/c"/>
    </xsl:when>
    </xsl:choose>
</xsl:stylesheet>

これを実行すると、エラーが発生します:スタイルシートのコンパイルに失敗しました。3つのエラーが検出されました。私は(1)xslコードの問題を修正し、(2)xslコードの断片をデバッグ/テストできるxsl用のjsfiddleのようなものを探しています。

4

1 に答える 1

4

chooseの外側を配置することはできませんがtemplate、その必要はありません。一致式で述語を使用できるため、削除する要素に一致するようにno-opテンプレートを宣言するだけです。

<xsl:template match="b[@flag='bar']/c" />

または、より一般的には、要素の親cがさまざまな名前を持っている可能性がある場合

<xsl:template match="c[../@flag='bar']" />

また

<xsl:template match="*[@flag='bar']/c" />
于 2012-12-20T18:13:25.960 に答える