1

このようなxmlフラグメントがいくつかあります

<an_element1 attribute1="some value" attribute2="other value" ... attributeN="N value">
<an_element2 attribute1="some value" attribute2="other value" ... attributeN="N value">
...

次のように変換する必要があります。

<an_element1>
<attribute1>some value</attribute1>
<atttibute2>other value</attribute2>
...
<attributeN>N value</attributeN>
</an_element1>
<an_element2>
<attribute1>some value</attribute1>
<atttibute2>other value</attribute2>
...
<attributeN>N value</attributeN>
</an_element2>
...

私はすでに他の回答にあるいくつかの例をうまく試しましたが、次のように要約できるこの問題に対する一種の一般的なアプローチがあるかどうかを知りたいと思いました:

an_element という名前の各要素に対して、それぞれの値を含む各属性のサブ要素を作成します。

繰り返し要素には重複した値 (すべての属性に対して同じ値を持つ 2 つの an_element アイテム) が含まれている可能性があるため、一意の要素のみをフィルター処理できるかどうかを知りたいと思いました。

フィルターが可能であれば、変換の前または後に適用する方が良いですか?

4

1 に答える 1

1

an_element という名前の要素ごとに、それぞれの値を含む各属性のサブ要素を作成します。

次のスタイルシートは、すべての属性を同様の名前の要素に変換します。属性から生成された要素は、ソース内の子要素からコピーされた要素よりも優先されます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XST/Transform" version="1.0">
  <xsl:template match="@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

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

特定の名前の要素に対してのみこれを行いたい場合は、次のようなものが必要です

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XST/Transform" version="1.0">
  <xsl:template match="an_element/@*">
    <xsl:element name="{name()}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>

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

変換する

<an_element foo="bar"/>

の中へ

<an_element>
  <foo>bar</foo>
</an_element>

しかし、変更せずに残し<another_element attr="whatever"/>ます。

于 2013-03-04T14:04:32.747 に答える