0

私がやりたいのは、要素をコンテキストとして指定することです。特定の名前の子があるかどうかを判断し、その子に特定の名前のノードがあるかどうかを判断して、それを操作できるようにします。これを 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>

みんなありがとう^ - ^

4

1 に答える 1

1

要素名にこれらの文字列が含まれているかどうかを確認しますか? または、あなたの物語が言うように、その正確な名前の要素が必要ですか?

すでに書いたようなことをするには、使用します

<xsl:for-each select="*[contains(name(), 'description')]/*[contains(name(), 'text')]">
  <xsl:value-of select="node()"/>
</xsl:for-each>

しかし、あなたが完全な名前を知っていれば、それはずっときれいです:

<xsl:for-each select="description/text">
  <xsl:value-of select="node()"/>
</xsl:for-each>

それでもうまくいかない場合は、ソース XML と変換をさらに確認する必要があります。


アップデート

この XML を使用する場合

<leaf>
  <description>
    <text>Various Words</text>
  </description>
  <description>
    <text>More Words</text>
  </description>
  <description>
    <text>Other Words</text>
  </description>
</leaf>

このスタイルシートを適用します

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/leaf">
    <xsl:for-each select="description/text">
      <xsl:value-of select="."/>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

出力は予想通りVarious WordsMore WordsOther Wordsです。可能な限りではなく、別のテンプレートを使用して変換を作成する必要があることを除いて、状況をよりよく説明しない限り、私はあなたを助ける方法がわかりませんfor-each. 上記と同じ出力を生成するこのバリエーションのように。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template match="/leaf">
    <xsl:apply-templates select="description/text"/>
  </xsl:template>

  <xsl:template match="text">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>
于 2013-06-06T13:54:09.727 に答える