私がやりたいのは、要素をコンテキストとして指定することです。特定の名前の子があるかどうかを判断し、その子に特定の名前のノードがあるかどうかを判断して、それを操作できるようにします。これを XPath 1.0 構文で行うことが重要です。
これまでに取得したコードはこれです。
<xsl:for-each select="child::*">
<xsl:if test="contains(name(), 'description')">
<xsl:for-each select="child::*">
<xsl:if test="contains(name(), 'text')">
<xsl:value-of select="node()"/>
</xsl:if>
</xsl:for-each>
</xsl:if>
</xsl:for-each>
それは機能しますが、大きくて醜いので、それを凝縮する方法があることを知っています. 1 つの子ノードに description という名前が付けられ、テキスト ノードが 1 つしかないことを期待しているため、for-each は不要です。
このソリューションが機能するはずだと思います
<xsl:for-each select="./description/text">
..
</xsl:for-each>
しかし、そうではありません。私は XPath 構文を十分に理解していないため、その理由を知ることはできません。
私が尋ねている理由は、子ノードに名前があるかどうかを検出する答えを見つけ、その子ノードのコンテキストに到達できる答えを見つけたにもかかわらず、2つを組み合わせた答えを見つけられなかったからです、おそらく私は十分に一生懸命探していませんでしたが、その場合はお詫び申し上げます。
編集:おっと、申し訳ありませんが、値を同等と比較する方法がわからなかったため、コードの contains() 部分も単なるハックであることに言及するのを忘れていました。
また、答えがある限り、<xsl:for-each select="description/text">
どちらも機能しません。
問題の XML のサンプルはこれです
<leaf>
<description>
<text> Various Words
</text>
</description>
</leaf>
コンテキストはリーフで、テキスト ノードに到達しようとしています。
編集:再臨:
私にとっての問題は、XSLT ファイルがデフォルトの名前空間 (私の場合は a) を使用していたことです。私がそれを付け加えていれば、ボロディンの答えは正しかったでしょう。
具体的には、誰かが知りたい場合に備えて、これは最終的に私のために働いたコードです。
<xsl:for-each select="a:description/a:text>
<xsl:value-of select="node()"/>
</xsl:for-each>
みんなありがとう^ - ^