0

私は次のxmlファイルを持っています:

<WindowProperties>
<skin>LP Connect</skin>
<showToOperator>false</showToOperator>
<showToVisitor>false</showToVisitor>
<ChatWindow>
  <field>
    <key>direction</key>
    <val>ltr</val>
  </field>
  <field>
    <key>enableCustomizedHeaderImageUrl</key>
    <val>false</val>
  </field>
  <field>
    <key>brandType</key>
    <val>noImage</val>
  </field>
  <field>
    <key>brandHeight</key>
    <val>158</val>
  </field>      
</ChatWindow>

キー要素を使用してチャットウィンドウのフィールドを並べ替えて、xmlが次のようになるようにします。

<WindowProperties>
    <skin>LP Connect</skin>
    <showToOperator>false</showToOperator>
    <showToVisitor>false</showToVisitor>
    <ChatWindow>
    <field>
        <key>brandHeight</key>
        <val>158</val>
      </field> 
<field>
        <key>brandType</key>
        <val>noImage</val>
      </field>

      <field>
        <key>direction</key>
        <val>ltr</val>
      </field>
      <field>
        <key>enableCustomizedHeaderImageUrl</key>
        <val>false</val>
      </field>

    </ChatWindow>
 </WindowProperties>

次のxslを試しました。

<ChatWindow>

                    <xsl:template match="ChatWindow">
                        <xsl:for-each select="field">
                            <xsl:sort select="key"/>
                            <key><xsl:value-of select="key"/></key>
                            <value><xsl:value-of select="val"/></value>
                        </xsl:for-each>
                    </xsl:template>

                </ChatWindow>

しかし、これはうまくいきませんでした。助けていただければ幸いです。

4

2 に答える 2

3

この単純な XSLT は、その仕事を行う必要があります。

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

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

  <xsl:template match="ChatWindow">
    <xsl:copy>
      <xsl:apply-templates select="field">
        <xsl:sort select="key" />
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

サンプル入力で実行すると、次が生成されます。

<WindowProperties>
  <skin>LP Connect</skin>
  <showToOperator>false</showToOperator>
  <showToVisitor>false</showToVisitor>
  <ChatWindow>
    <field>
      <key>brandHeight</key>
      <val>158</val>
    </field>
    <field>
      <key>brandType</key>
      <val>noImage</val>
    </field>
    <field>
      <key>direction</key>
      <val>ltr</val>
    </field>
    <field>
      <key>enableCustomizedHeaderImageUrl</key>
      <val>false</val>
    </field>
  </ChatWindow>
</WindowProperties>

<xsl:output method="text" />何らかの理由で絶対に使用する必要がある場合は、次のことを行うことができますが、お勧めしません。

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

  <xsl:template match="*">
    <xsl:value-of select="concat('&lt;', name(), '&gt;')"/>
    <xsl:apply-templates />
    <xsl:value-of select="concat('&lt;/', name(), '&gt;')"/>
  </xsl:template>

  <xsl:template match="ChatWindow">
    <xsl:value-of select="concat('&lt;', name(), '&gt;')"/>
    <xsl:apply-templates select="field">
      <xsl:sort select="key" />
    </xsl:apply-templates>
    <xsl:value-of select="concat('&lt;/', name(), '&gt;')"/>
  </xsl:template>
</xsl:stylesheet>

または、もう少し長くなりますが、少しきれいになります。

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

  <xsl:template name="tag">
    <xsl:param name="slash" />
    <xsl:value-of select="concat('&lt;', $slash, name(), '&gt;')"/>
  </xsl:template>

  <xsl:template name="cTag">
    <xsl:call-template name="tag">
      <xsl:with-param name="slash" select="'/'" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="*">
    <xsl:call-template name="tag" />
    <xsl:apply-templates />
    <xsl:call-template name="cTag" />
  </xsl:template>

  <xsl:template match="ChatWindow">
    <xsl:call-template name="tag" />
    <xsl:apply-templates select="field">
      <xsl:sort select="key" />
    </xsl:apply-templates>
    <xsl:call-template name="cTag" />
  </xsl:template>
</xsl:stylesheet>
于 2013-03-10T17:32:01.420 に答える
1

編集:これを行う適切な方法であるため、@JLRisheからの回答を参照してください。以下の私の答えは「テキスト」出力要件を満たしていますが、実際にはもっと複雑で同じことを達成しています。

私は完全な例を削除<CDATA>し、XSLT からのテキスト出力で XML 要素やその他のマークアップを生成する必要がある場合 (コメントなどを生成する場合など) に備えて、元の回答のコードを保持しています。純粋な XML を生成しようとしている場合、これは最善の方法ではありません。

元の回答:

要約すると、質問を理解するために、「テキスト」(XML ではない) を返す XSLT テンプレートがありますが、XML のように見えるように XML タグを出力に保持する必要があります。

これを行うには、<CDATA[ ]]>以下のように、テキストとして扱いたい XML タグの周囲にセクションが必要です。

    <xsl:template match="ChatWindow">
      <xsl:for-each select="field">
        <xsl:sort select="key"/>
        <![CDATA[<key>]]>
          <xsl:value-of select="key"/>
        <![CDATA[</key>]]>
        <![CDATA[<value>]]> 
          <xsl:value-of select="val"/>
        <![CDATA[</value>]]>
      </xsl:for-each>
    </xsl:template>

CDATAセクションを結合するために途中でこれを行うこともできますが、上記の方がきれいに見えると思います。(同じ結果)

    <xsl:template match="ChatWindow">
      <xsl:for-each select="field">
        <xsl:sort select="key"/>
        <![CDATA[<key>]]>
          <xsl:value-of select="key"/>
        <![CDATA[</key>
        <value>]]>
          <xsl:value-of select="val"/>
        <![CDATA[</value>]]>
      </xsl:for-each>
    </xsl:template>
于 2013-03-10T15:43:43.593 に答える