2

XSLT を組み合わせる簡単な方法はありますか。私は XSLT に不慣れで、それらを作成する方法と、それらを使用して目的の結果を得る面白い方法を理解しています。ただし、現時点では、出力を目的の出力に変換するために 1 つの XSLT を使用できます。しかし、その後すぐに私は別のものを持っています。各 XSLT は、あるものから別のものへの出力を変更します。

たとえば、これらは問題を説明するための単純な XSLT です。

XSLT 1:

<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="/root">
        <xsl:element name="imageScene7Response"  xmlns="http://www.castiron.com/burberry/digitalcatalogue/response">
            <xsl:element name="rcode">0</xsl:element>
            <xsl:element name="rmessage">success</xsl:element>
            <xsl:copy-of select="@*"/>
            <xsl:apply-templates select="payload"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="/root/payload">
        <xsl:if test="not(productId = preceding-sibling::payload/productId)">

            <xsl:element name="payload" xmlns="http://www.castiron.com/burberry/digitalcatalogue/response">
                <xsl:element name="productId">
                    <xsl:value-of select="productId"/>
                </xsl:element>
                <xsl:for-each select="../payload[productId = current()/productId]">
                    <xsl:choose>
                        <xsl:when test="type = '0' and preceding-sibling::payload/type = type and productId = preceding-sibling::payload/productId">
                            <xsl:element name="alternativeImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '0'">
                            <xsl:element name="mainImage">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type &gt; '0' and type &lt; '70'">
                            <xsl:element name="alternativeImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '70'">
                            <xsl:element name="video">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = '80'">
                            <xsl:element name="lookbookImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                        <xsl:when test="type = 'sw'">
                            <xsl:element name="swatchImages">
                                <xsl:value-of select="url"/>
                            </xsl:element>
                        </xsl:when>
                    </xsl:choose>
                </xsl:for-each>
            </xsl:element>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

それで:

<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="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match=
        "*[not(@*|*|comment()|processing-instruction()) 
        and normalize-space()=''
        ]"/>
</xsl:stylesheet>

次に、他の XSLT の他のロジック。

結合された 1 つの XSLT でテンプレートを上下に配置するのと同じくらい簡単ですか?

XML SNIPT

<?xml version="1.0"?>
<root>
    <payload>
        <productId>11111</productId>
        <type>0</type>
        <url>https://11111</url>
    </payload>
    <payload>
        <productId>11111</productId>
        <type>1</type>
        <url>https://11111</url>
    </payload>
    <payload>
        <productId>11111</productId>
        <type>1</type>
        <url></url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>0</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>1</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>sw</type>
        <url>https://22222</url>
    </payload>
    <payload>
        <productId>22222</productId>
        <type>sw</type>
        <url></url>
    </payload>
</root>

これは最良の例ではありませんが、うまくいきます!

4

3 に答える 3

2

答えは次のとおりです

複数の XSL テンプレートがある場合、それらが XML に順次適用されることが意図されている可能性があります。たとえば、3 つの XSLT がある場合、最初のテンプレートが元のドキュメントに適用され、2 番目のテンプレートが元のドキュメントに適用される可能性があります。最初の変換の結果、3 番目の変換は 2 番目の変換の結果に変換されます。

これはパイプライン アプローチとして知られています。XML は XSLT パイプラインに沿って流れ、反対側から結果が出るまで繰り返し変換されます。これは完全に有効なアプローチです。

XSLT が順次適用されるように設計されている場合は、そのままにしておくのが最善です。それらを組み合わせて巨大な XSLT にすることは可能ですが、XML ノード セットをテンプレートからテンプレート。このアプローチについてはここで説明しますが、これがより純粋なアプローチであるという著者の結論には同意しません。

上記の例では、2 つの明確な XSLT があります。1 つ目は明らかに構造的なもので、XML 応答の構造を別の XML ドキュメントに変換するように設計されています。あなたが持っている2番目のXSLTは、ほとんどユーティリティXSLTです.属性または属性ではないものを取り除くように設計されているようです. この場合、XML 応答メッセージに順番に適用するのがおそらく最善でしょう。

于 2012-09-09T13:43:22.550 に答える
1

XSLT 1.0 および 2.0 には、スタイルシートを結合するためのネイティブ命令 xsl:import および xsl:include が 2 つあります。XSLT 3.0 には 3 番目のメカニズムがありますが、これについては後で説明します。

インポート手順は次のようになります...

<xsl:import href="my-other-transform.xsl" />

インクルード命令も同様です

<xsl:include href="my-other-transform.xsl" />

xsl:import は他のスタイル シートを参照し、そのテンプレートを使用できるようにしますが、メインのスタイル シートのテンプレートよりも優先度が低くなります。xsl:include は、命令がインクルードされたスタイルシートの逐語的なコピーに置き換えられたかのように機能します。

一般に、解決しようとしている問題に非常に特化したトップレベルのスタイルシートを作成し、インポートしたスタイルシートがより一般化された汎用的なスタイルシートをインポートするための推奨される手法です。

クライアント側で XSLT 1.0 を使用している場合はわかりませんが、ブラウザーの xsl:import と xsl:include のサポートが制限されるのではないかと思います。サーバー側で XSLT 1.0 を使用している場合は、恥を知れ! XSLT 2.0 にアップグレードしない理由はありません。

XSLT 3.0 では、xsl:package 命令を使用して、API ポイントの可視性をきめ細かく制御できるモジュールの自己完結型コレクションを宣言できます。

于 2012-09-09T14:35:05.840 に答える
0

最初の変換を改善して、2 番目の変換をなくすこともできます

OPが質問を編集し、ソースXMLドキュメントを提供したら、この回答を更新していただければ幸いです。

異なる変換を組み合わせる一般的な方法については、次のとおりです。

使用<xsl:import>はあなたの友達です。

多くが他のものをインポートする 150 以上のスタイルシート モジュールを含むFXSLライブラリを見てください。

経験則

同じスタイルシート モジュールに含まれるテンプレートまたはテンプレートのグループに、複数のケースで使用される可能性のある便利な機能が含まれている場合は常に、他の方法でインポートできる便利な方法でこれらを記述することをお勧めします。 、より具体的なスタイルシート モジュールで、この機能を必要とするため、異なる特定のケースごとにこの機能を再実装する必要がありません。

于 2012-09-09T14:56:18.920 に答える