29

XMLノードに空でない子が少なくとも1つあるかどうかを確認する必要があります。このXMLに適用すると、式は次のようになります。true

<xml>
    <node>
       <node1/>
       <node2/>
       <node3>value</node3>
    </node>
</xml>

この式を使おうとしましたが、すべての子が空でない<xsl:if test="not(/xml/node/child::* = '')">かどうかをチェックしているようです。

少なくとも1つの要素が空でないtrue場合に返される式を作成するにはどうすればよいですか?ノードchldrenを反復処理する別のテンプレートを作成せずにこれを行う方法はありますか?

UPD:空でないノードを数えることを考えて
test="count(not(/xml/node/child::* = '')) &gt; '0'"
いますが、どういうわけかそれを正しく機能させることができません。この表現は整形式ではありません。

4

4 に答える 4

34

More accurate, simpler and more efficient (no need to use the count() function):

  /*/node/*[text()]

If you want to exclude any element that has only whitespace-only text children, use:

  /*/node/*[normalize-space()]
于 2012-12-04T13:22:37.153 に答える
12

あなただけが必要<xsl:if test="/xml/node/* != ''" />です。

XPath では、一方がノード セットで他方が文字列である=or比較は、セット内のいずれかのノードが比較に合格した場合に成功します。したがって!=

not(x = '')

x「現在のノードの子要素に空の文字列値があるわけではない」ことを意味します。これは、

x != ''

これは、「現在のノードの少なくとも 1xつの子要素に、空でない文字列値がある」ことを意味します。特に、すべての 子が空であることを確認したい場合xは、「二重陰性」テストを使用する必要があります

not(x != '')
于 2012-12-04T13:21:35.657 に答える
4

ジョブを実行する XPath の 1 つを次に示します。

count(/*/node/*[text()]) &gt; 0

サンプル XSLT で使用する場合:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
     <xsl:value-of select="count(/*/node/*[text()]) &gt; 0" />
  </xsl:template>

</xsl:stylesheet>

...次に、提供されたサンプル XML に適用されます。

<xml>
  <node>
    <node1/>
    <node2/>
    <node3>value</node3>
  </node>
</xml>

...期待される結果が生成されます。

true

単純に変更された XML に対して同じ XSLT を適用すると、次のようになります。

<xml>
  <node>
    <node1/>
    <node2/>
    <node3/>
  </node>
</xml>

...再び、期待される結果が生成されます。

false

説明:

<node>使用される XPathは、空でないテキスト値 ( で指定) を持つ要素のすべての子 (つまり、ルート要素の子) を検索しtext()ます。そのような子の数が<node>0 より大きい場合、XPath は に解決されtrueます。

于 2012-12-04T13:11:08.647 に答える
0
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <xsl:value-of select="/*/node/*[string-length(text()) &gt;0]!=''"/>
    </xsl:template>
</xsl:stylesheet>

説明 これは、文字列の長さが 0 より大きい最初のノードを見つけ、そのようなノードの内容を空の文字列と比較します (比較により、空でない文字列ノードの存在が返されます)。このコードを使用して、任意のノードで特定の基準を探すこともできます。たとえば、特定の文字列を含むノード、または何らかの文字またはその他の条件で始まるノードの存在を識別します。これをノード参照の内部条件として使用して、コードが魔法のように機能するようにしてください。

于 2013-09-13T03:24:56.170 に答える