0

次のような XML があります。

<Root attr1="ABC">
    <Element1>
        <Element2>
             <Element3 />    
        </Element2>
        <Element2>
             <Element3 />    
        </Element2>
    <Element1>
</Root>

これを処理する XSLT がいくつかありますが、何らかの理由でルート ノードを「ルート」として参照します (引用符なし)。

たとえば、ルートノードが呼び出されることを除いて、同じ構造の XML をいくつか持つことができるようになりました。XSLT の 2 つのバージョンは必要ないので、より一般的な方法でルート ノードを参照できますか。

私が言いたいことの例として...

<xsl:when  test="/Root/@attr1 = 'ABC'">

これも機能する必要があります

<xsl:when  test="/NewRoot/@attr1 = 'ABC'">

この件に関する私の読書では、参照がドキュメント要素ではなくルートノードであることを確認する必要があることに注意してください。後者はXMLのこの部分であると想定しています

<?xml version="1.0" encoding="UTF-8"?>

どんな助けでもこれまでに感謝しています。

ありがとう

4

2 に答える 2

2

より一般的な方法でルート ノードを参照できますか?

使用するだけです:

/*/@attr1 = 'ABC'

これはtrue()、XML ドキュメントの最上位要素 (その名前に関係なく) に という名前の属性がありattr1、その文字列値が文字列 "ABC" である場合に正確に生成されます。

ここでは、整形式の XML ドキュメントには必ず 1 つの最上位要素が必要であるという事実を利用しています。したがって、次のように記述する必要はありません。/*[1]

于 2013-05-01T15:29:45.933 に答える
1

たとえば、使用することをお勧めします

<xsl:template match="/Root | /NewRoot">
  <xsl:if test="@attr1 = 'ABC'">...</xsl:if>
</xsl:template>

または、属性チェックをテンプレート一致パターンに入れる方が良いかもしれません。

    <xsl:template match="/Root | /NewRoot">
      <xsl:apply-templates select="@*"/>
    </xsl:template>

<xsl:template match="/Root/@attr1[. = 'ABC'] | /NewRoot/@attr1[. = 'ABC']">
  <!-- now output here what you want to output if the condition is met -->
</xsl:template>

xsl:when test絶対パスでを使用する必要がある場合は、 を使用してtest="/Root/@attr1 = 'ABC' or /NewRoot/@attr1 = 'ABC'"ください。

于 2013-05-01T14:01:59.970 に答える