0

次のような XML ファイルがあります。

<doc>
  <element>
    <word>
      <text>one word</text>
    </word>
    <word>
      <text>two words</text>
    </word>
  </element>
  <element>
    <other>
      <text>the sky</text>
    </other>
    <word>
      <text>NN NN</text>
    </word>
  </element>
</doc>

そして、次のように、タグが 1 つだけあり、2 つの行が続いている場合はその行の内容が必要です。

<element>
    <word>
      <text>one word</text>
       <text>two words</text>
    </word>
</element>

問題は、タグ<xsl:element>を取得するために を生成していることです。<word>そして、これ<xsl:element>はすでにタグを正しい順序で配置する<xsl:for-each>ループ内にあり<word>ます (属性のフィルタリング)。

私の以前のXMLドキュメントは次のようなものです:

<doc>
  <element class="word">
    <text>one word</text>
  </element>
  <element class="word">
    <text>NN NN</text>
  </element>
  <element class="word">
    <text>two words</text>
  </element>
  <element class="other">
    <text>the sky</text>
  </element>
</doc>

どんな助けでも素晴らしいでしょう、ありがとう:)

-- 詳細 --

これは私が望む結果です:

<doc>
   <element>
      <word>
         <text>one word</text>
         <text>two words</text>
      </word>
   </element>
   <element>
      <other>
         <text>the sky</text>
      </other>
      <word>
         <text>NN NN</text>
      </word>
  </element>
</doc>

また、タグの閉じたリストがないため、タグの単語などを指定できませ。だから私はxsl:variableを使用しています:

<xsl:for-each select="element">
    <xsl:variable name="name">
      <xsl:value-of select="@class"/>
    </xsl:variable>
    <xsl:element name="{$name}">
        <text>
          <xsl:value-of select="."/>
        </text>
    </xsl:element>
</xsl:for-each>
4

3 に答える 3

1

これを試して:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="element/*">
    <xsl:if test="not(preceding-sibling::*[name() = name(current())])">
      <xsl:copy>
        <xsl:apply-templates select="* | following-sibling::*[name()=name(current())]/*" />
      </xsl:copy>
    </xsl:if>
  </xsl:template>

  <!-- Identity template -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

同じ名前の前の兄弟(つまり、それぞれの最初の兄弟)がない子ノードを探し、elementそれ自体の子ノードと同じ名前の後続の兄弟の子ノードにテンプレートを適用するだけです。 。

于 2012-10-22T12:48:51.933 に答える
0

<xsl:apply-templates/>...を使用するだけで要素を「アンラップ」できます。

XML入力

<doc>
    <element>
        <word>
            <text>one word</text>
        </word>
        <word>
            <text>two words</text>
        </word>
    </element>
    <element>
        <other>
            <text>the sky</text>
        </other>
        <word>
            <text>NN NN</text>
        </word>
    </element>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

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

    <xsl:template match="word|other">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

出力

<doc>
   <element>
      <word>
         <text>one word</text>
         <text>two words</text>
      </word>
   </element>
   <element>
      <word>
         <text>the sky</text>
         <text>NN NN</text>
      </word>
   </element>
</doc>
于 2012-10-19T15:42:22.923 に答える
0

この変換:

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

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="element/*"/>
 <xsl:template match="element/*[1]">
     <word>
       <xsl:apply-templates select="../*/*"/>
     </word>
 </xsl:template>
</xsl:stylesheet>

提供された XML ドキュメントに適用した場合:

<doc>
    <element>
        <word>
            <text>one word</text>
        </word>
        <word>
            <text>two words</text>
        </word>
    </element>
    <element>
        <other>
            <text>the sky</text>
        </other>
        <word>
            <text>NN NN</text>
        </word>
    </element>
</doc>

必要な正しい結果を生成します(私が推測することです)

<doc>
   <element>
      <word>
         <text>one word</text>
         <text>two words</text>
      </word>
   </element>
   <element>
      <word>
         <text>the sky</text>
         <text>NN NN</text>
      </word>
   </element>
</doc>
于 2012-10-19T18:27:30.197 に答える