2

これはこれに関する唯一の質問ではありませんが、コードが間違っている理由を他のソリューションから理解できませんでした。これは割り当て用であり、ほとんどを理解しましたが、条件が真と評価されない理由がわかりません。contains('a', 'a')or even thenなどのダミー句を作成すると1=1、適切な出力が表示されます (もちろん、条件によってフィルター処理されていません)。

また、何も使用せずに現在の要素の名前を出力しようとすると、出力され<xsl:value-of select="name(.)" />ます。明らかに、私がここに到達していないものがありますが、それは私を逃れています. どんな手掛かり ?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" version="1.0" indent="yes" encoding="ISO-8859-1"/>

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

    <xsl:template match=".">
        <xsl:if test="contains(name(.),'a')">
            <xsl:copy>
                <xsl:copy-of select="@*"/>
                <xsl:apply-templates select="child::node()" />
            </xsl:copy>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

この場合、XML スキーマはまったく問題になりません。一部の要素には文字 a が含まれていることを知っています (ルート要素を含む)。

また、呼び出す<xsl:value-of select="name(node())" />と、XSLT ドキュメントによって処理されているファイル内の現在のノードの名前ではなく、XSLT ファイル ノード ("xsl:stylesheet") の名前が取得されるのはなぜですか?

ありがとう !

4

2 に答える 2

3

XSLT を実行してもエラーが発生しないことに驚いています。なぜなら、Mircosoft の XSLT 処理を使用して実行しようとすると、「述語外のパターンでは 'child' 軸と 'attribute' 軸のみが許可されている」というエラーが表示されるからです。. これは、XPath では、ドットがコンテキスト ノードの省略形であるためです。

あなたが使用している XSLT 処理がトップレベルのドキュメント ノードをmatch="."(match="/" を実行するのと同様に) 一致させているかどうか疑問に思っています。これにより、出力が得られない理由が説明されます。

いずれにせよ、あなたは本当に<xsl:template match="*">ここで必要であり、そうではありません<xsl:template match="." />

しかし、この問題を解決するために実際にすべきことは、XSLTの基本的な設計パターンであるXSLT Identity Transformに基づいて構築することです。独自に、入力 XML の既存のノードをすべてコピーしますが、必要なケースに合わせてテンプレート マッチングを追加するだけです。

あなたの場合、名前に「a」を含む要素のみをコピーしたいと言っています。逆に考えて、その場合、名前に「a」が含まれていない要素をコピーしたくないとします。したがって、恒等変換に追加する必要があるのはこのテンプレートだけです

<xsl:template match="*[not(contains(name(), 'a'))]" />

余談ですが、ここの「/」の初期テンプレートは実際には必要ありません

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

XSLT には組み込みテンプレートの概念があり、XSLT に明示的なテンプレートがない場合に使用されます。これらの組み込みテンプレートは、テキスト ノードのテキストを出力し、他のノードの場合は、(ノードをコピーせずに) 子の処理を続行します。したがって、「/」のすべてのテンプレートが行っていることは、とにかく組み込みのテンプレートが行うことです。

于 2013-08-12T13:08:50.777 に答える
0

いくつかの基本的な概念が欠けているようです。

必要match='.'なすべての要素を一致させたい場合は、match='*'.

そして、現在のノードの最初の子ノードの名前を要求していて、取得xsl:stylesheetしているので、スタイルシートを入力 XML として、現在のノードをルート ノードとしてその命令を実行していることがわかります。

また、ドキュメント要素に 'a' が含まれていない場合、ドキュメントの残りの部分を処理するために何もしていないという問題が発生することが予想されます。

何がうまくいかないかを示すのではなく、あなたの割り当てが何であるかを説明した方がおそらく助けになるでしょう...しかし、繰り返しになりますが、誰かがあなたに答えを与えたとしても、あなたはまったく助けられませんでした。

于 2013-08-11T22:19:31.487 に答える