10

同じテンプレート内のテンプレートと一致したノードのタイプを確認することはできますか?もしそうなら、どうすればいいですか?たとえば、私は次のようなことをしたいと思います。

<xsl:template match="@*|node()">
    <xsl:choose>
        <xsl:when test="current() is an attribute">
        <!-- ... -->
        </xsl:when>
        <xsl:when test="current() is an element">
        <!-- ... -->
        </xsl:when>
        <xsl:otherwise>
        <!-- ... -->
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
4

3 に答える 3

21

ここでこの回答を見てください。これにより、必要な情報が得られるはずです。

違い:child :: node()とchild :: *

これにより、次のxsl:chooseが提供され、ドキュメントノードを含むすべてのノードがテストされます。

<xsl:choose>
  <xsl:when test="count(.|/)=1">
    <xsl:text>Root</xsl:text>
  </xsl:when>
  <xsl:when test="self::*">
    <xsl:text>Element </xsl:text>
    <xsl:value-of select="name()"/>
  </xsl:when>
  <xsl:when test="self::text()">
    <xsl:text>Text</xsl:text>
  </xsl:when>
  <xsl:when test="self::comment()">
    <xsl:text>Comment</xsl:text>
  </xsl:when>
  <xsl:when test="self::processing-instruction()">
    <xsl:text>PI</xsl:text>
  </xsl:when>
  <xsl:when test="count(.|../@*)=count(../@*)">
    <xsl:text>Attribute</xsl:text>
  </xsl:when>
</xsl:choose>
于 2013-01-02T09:12:40.537 に答える
7

XPath2.0で導入されたシーケンスタイプの式を使用することを強くお勧めします。例えば:

. instance of document-node()
. instance of element()
于 2014-04-04T11:20:25.127 に答える
6

$nodeノードがルートノードであるかどうかを判断するためのより正確な方法

not(count($node/ancestor::node()))

TimCの回答の式は、現在のノードのタイプをテストします。

count(.|/)=1

ただし、現在のドキュメントではなく、別のドキュメントに属している可能性のある変数内のノードのタイプを判別する場合には適用されません。

また、名前空間ノードのテスト

count($node | $node/../namespace::*) = count($node/../namespace::*) 
于 2013-01-02T14:00:22.273 に答える