0

次の XML を使用:

<Sections><Section Type="Type1" Text="blabla1"><Section Type="Type2" Text="blabla2"/>  </Section></Sections>

次の出力を生成したい:

<Sections><Type1 Text="blabla1"><Type2 Text="blabla2"/></Type1></Sections>

何時間もの間 XSLT で遊んでいますが、何から始めるべきかさえわかりません... XLST 変換には多くの良い例がありますが、再帰性と Type 属性を使用してノードを作成する方法についてまだ何かが欠けています。ドキュメント内の任意のセクション ノードを対応するタイプ属性に変換する方法は?

同様のことを行うチュートリアル、xsltリソース、または何かを始めるのに最適です

ありがとう

4

1 に答える 1

3

これはどうですか(コメントで要求されているように、両方向に変換するように変更されています):

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

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

  <!-- Prevent Type attributes from being copied to the output-->
  <xsl:template match="@Type" />

  <!-- Convert <Section Type="Nnn" ... /> into <Nnn ... /> -->
  <xsl:template match="Section">
    <xsl:element name="{@Type}">
      <xsl:apply-templates select="@* | node()"/>
    </xsl:element>
  </xsl:template>

  <!-- Convert <Nnn .... /> into <Section Type="Nnn" ... /> -->
  <xsl:template match="Sections//*[not(self::Section)]">
    <Section Type="{name()}">
      <xsl:apply-templates select="@* | node()" />
    </Section>
  </xsl:template>

</xsl:stylesheet>

最初の例で実行したときの出力:

<Sections>
  <Type1 Text="blabla1">
    <Type2 Text="blabla2" />
  </Type1>
</Sections>

2 番目の例で実行したときの出力:

<Sections>
  <Section Type="Type1" Text="blabla1">
    <Section Type="Type2" Text="blabla2" />
  </Section>
</Sections>
于 2013-01-16T06:03:05.043 に答える