0

私はXmlファイルを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <child>
    <gc>gc1Value</gc>
  </child>
  <child>child2Value</child>
  <child>
    <gc>gc2Value</gc>
    <gc>gc3Value</gc>
    <gc>
      <ggc>ggcValue</ggc>
      <ggc>ggcValue</ggc>
    </gc>
  </child>
</root>

およびXsltファイル:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
      <root>
      <xsl:for-each select="root/child">
        <xsl:if test=".!=''">
          <value>
            <xsl:value-of select="."/>
          </value>
        </xsl:if>
        <xsl:for-each select="root/child/gc">
          <xsl:if test=".!=''">
            <value>
              <xsl:value-of select="."/>
            </value>
          </xsl:if>
          <xsl:for-each select="root/child/gc/ggc">
            <xsl:if test=".!=''">
              <value>
                <xsl:value-of select="."/>
              </value>
            </xsl:if>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
      </root>
    </xsl:template>
</xsl:stylesheet>

私はこの種の結果を見ることを期待しています:

<root>
  <value>gc1Value</value>
  <value>child2Value</value>
  <value>gc2Value</value>
  <value>gc3Value</value>
  <value>ggcValue</value>
  <value>ggcValue</value>
</root>

しかし、私はこの結果を得ています:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <value>
    gc1Value
  </value>
  <value>child2Value</value>
  <value>
    gc2Value
    gc3Value

      ggcValue
      ggcValue

  </value>
</root>

.selectに使用すると、現在のノードの値のみが選択されると思いましたが、子からも値を取得しているようです。代わりに何をすべきですか?

4

3 に答える 3

1

問題はここにあります:

    <xsl:if test="gc!=''">
      <value>
        <xsl:value-of select="."/>
      </value>
    </xsl:if>

「。」現在のノードとそのすべての子を取得します。

node::text() を使用します [つまり。select="text()" ] テキストのみが必要な場合。また、'' の代わりに 'string-length(node) != 0' などを使用することをお勧めします。

于 2012-09-26T20:52:28.113 に答える
0

あなたの問題はあなたの出力にあります。

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

改行+空白+実際の値+改行+空白があります。

于 2012-09-26T20:50:10.193 に答える
0

単純にすべてのテキスト ノードを要素として出力することが意図されている場合は、要素名に関係なく、任意の XML 構造で機能する、より単純化されたアプローチを取ることができます。

たとえば、この XSLT を試してください。これは、子要素を処理するだけの要素の組み込みテンプレート ルールに依存します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/*">
      <xsl:copy>
         <xsl:apply-templates />
      </xsl:copy>
   </xsl:template>

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

これにより、期待される結果も得られるはずです。

于 2012-09-27T09:27:06.790 に答える