0

レコード セットをフィルター処理しようとしています。次の XSLT で動作するようになりましたが、見栄えがよくありません。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:r="http://www.castiron.com/response" exclude-result-prefixes="r">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name="Response">
            <xsl:element name="rcode">
                <xsl:text>0</xsl:text>
            </xsl:element>
            <xsl:element name="rmesage">
                <xsl:text>0</xsl:text>
            </xsl:element>
            <xsl:element name="payload">

                <xsl:for-each select="Response/payload/globalBuy[season='A09']">

                    <xsl:element name="season"><xsl:value-of select="season"/></xsl:element>
                    <xsl:element name="productId"><xsl:value-of select="productId"/></xsl:element>
                    <xsl:element name="globalBuyFlag"><xsl:value-of select="globalBuyFlag"/></xsl:element>

                </xsl:for-each>

            </xsl:element>
        </xsl:element>

    </xsl:template>

</xsl:stylesheet>

さらに、名前空間がルートに表示されるときに問題が発生します。以下のサンプル XML:

<?xml version="1.0" encoding="UTF8"?>
<Response xmlns="http://www.castiron.com/response">
    <payload>
        <globalBuy>
            <season>CD12</season>
            <productId>123456</productId>
            <globalBuyFlag>XXL</globalBuyFlag>
        </globalBuy>
    </payload>
</Response>
4

2 に答える 2

2

美しさは見る人の目にある; あなたのコードのどの側面がきれいに見つからないのかわかりません。しかし、私はそれを次のように書き直すことから始めます:

<xsl:template match="/">
    <Response>
        <rcode>0</rcode>
        <rmesage>0</rmesage>
        <payload>
            <xsl:copy-of select="Response/payload/globalBuy[season='A09']/
                                    (season, productId, globalBuyFlag)">
        </payload>
    </Response>

</xsl:template>

xsl:copy-of式はXPath2.0を使用します。XSLT 1.0ソリューションが必要な場合は、xsl:for-eachをに戻す必要があります。

名前空間に関しては、「XSLTデフォルトの名前空間」をグーグルで検索すると、エラーを説明する100万件の投稿が見つかります。

于 2012-04-30T16:36:28.443 に答える
2

xsl:elementの使用をすべて削除することで、コードを単純化できます。要素名を動的に生成する必要がない限り、要素を通常の XML として書き出すのは非常に簡単です。だから、これを書く代わりに....

<xsl:element name="rcode">
    <xsl:text>0</xsl:text>
</xsl:element> 

これだけ書いて…

<rcode>0</rcode>

フィルタリングに関しては、XML をコピーするだけで、フィルターに一致する特定のアイテムのみを含める場合は、ID テンプレートをオーバーライドして、含めたくないアイテムに一致するテンプレートを作成し、単純に無視することができます。彼ら。

この単純化された XSLT を試してください

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

   <xsl:template match="/Response">
      <xsl:copy>
         <xsl:apply-templates select="@*" />
         <rcode>0</rcode>
         <rmesage>0</rmesage>
         <xsl:apply-templates select="node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="globalBuy[not(season='A09')]" />

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

以下のXMLに当てはめると

<Response>
   <payload>
      <globalBuy>
         <season>CD12</season>
         <productId>123456</productId>
         <globalBuyFlag>XXL</globalBuyFlag>
      </globalBuy>
      <globalBuy>
         <season>A09</season>
         <productId>123456b</productId>
         <globalBuyFlag>XXLb</globalBuyFlag>
      </globalBuy>
   </payload>
</Response>

次に、以下が出力されます

<Response>
   <rcode>0</rcode>
   <rmesage>0</rmesage>
   <payload>
      <globalBuy>
         <season>A09</season>
         <productId>123456b</productId>
      <globalBuyFlag>XXLb</globalBuyFlag>
   </globalBuy>
   </payload>
</Response>

わかりやすくするために、この例ではすべての名前空間を削除したことに注意してください。

編集:デフォルトの名前空間を処理したい場合、XSLT 1.0 では、一致する各要素の名前空間を明示的に参照する必要があります。次のようにします。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:r="http://www.castiron.com/response" exclude-result-prefixes="r">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/r:Response">
      <xsl:copy>
         <rcode xmlns="http://www.castiron.com/response">0</rcode>
         <rmesage xmlns="http://www.castiron.com/response">0</rmesage>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="r:globalBuy[not(r:season='A09')]" />

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>   
</xsl:stylesheet>
于 2012-04-30T16:31:57.937 に答える