7

リスト構造の着信 XML ファイルがあります。

<list>
  <listItem>
    <name>elementOne</name>
    <value>elementOneValue</name>
  </listItem>
  <listItem>
    <name>elementTwo</name>
    <value>elementTwoValue</name>
  </listItem>
</list>

私はこの構造に変換しようとしています:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

これは XSL で実装するのは簡単なロジックですが、複雑な問題に直面しています。

<xsl:for-each select="/list/listItem">
  <xsl:element name="<xsl:value-of select="name"/>">
    <xsl:value-of select="value"/>
  </xsl:element>
</xsl:for-each>

<xsl:element>連続する二重引用符がタグを壊していると想定しているため、機能しません

<xsl:for-each select="/list/listItem">
  <<xsl:value-of select="name"/>>
    <xsl:value-of select="value"/>
  </<xsl:value-of select="name"/>>
</xsl:for-each>

<<or >>and を使用できないため機能しません

<xsl:for-each select="/list/listItem">
  &lt;<xsl:value-of select="name"/>&gt;
    <xsl:value-of select="value"/>
  &lt;/<xsl:value-of select="name"/>&gt;
</xsl:for-each>

XML parseable <orの代わりに > と < がコードに含まれるため、機能しません>。これは非常に簡単な解決策だと思っていましたが、インターネット上で記録が見つかりません。私が見落としている簡単な修正は何ですか?

4

3 に答える 3

14

<xsl:element>XSLT命令を使用した完全で短い解決策は次のとおりです。

<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="listItem">
   <xsl:element name="{name}">
     <xsl:value-of select="value"/>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると (整形式になるように修正されます):

<list>
    <listItem>
        <name>elementOne</name>
        <value>elementOneValue</value>
    </listItem>
    <listItem>
        <name>elementTwo</name>
        <value>elementTwoValue</value>
    </listItem>
</list>

必要な結果が生成されます:

<elementOne>elementOneValue</elementOne>
<elementTwo>elementTwoValue</elementTwo>

注意してください:

  1. <xsl:element>静的に未知の名前を持つ要素を作成するための命令の使用。

  2. AVT ( Attribute-Value-Templatename ) を使用して、コンパクトで読みやすい方法で属性を指定します。

  3. elementOneおよびの文字列値がelementTwo要素名 (QName) の字句/構文規則に従っていない場合、エラーが発生する可能性があります。

于 2011-01-16T22:56:48.067 に答える
7

代わりに中括弧を使用できると思います<xsl:value-of>

<xsl:element name="{name}">
    <xsl:value-of select="value"/>
</xsl:element>
于 2011-01-16T22:42:00.353 に答える
0

試しませんでしたが、これはうまくいきます...

   <xsl:for-each select="/list/listItem">
      <xsl:variable name="elemName" select="name"/>
      <xsl:element name="$elemName">
        <xsl:value-of select="value"/>
      </xsl:element>
    </xsl:for-each>
于 2011-01-16T22:43:31.563 に答える