1

XSLTパラメーターとして格納されているノードセットを使用して1つのXMLドキュメントを別のXMLドキュメントに変換する必要があるという要件があります。

入力:

<m:addCustomer xmlns:p="http://test.org"/>

予想される出力形式:

<m:addCustomer xmlns:p="http://test.org"/>
   <m:e1>some_value1</m:e1>
   <m:e2>some_value2</m:e2>
   <m:e3>some_value3</m:e3>
</m:addCustomer>

私が直面している問題は、「期待される出力」形式のコンテンツを渡すことができる唯一の方法は、次のようにXSLTパラメーターを使用することです。

<xsl:param name="testParam" xmlns:m="http://test.org">
    <m:customerData> 
         <m:e1>some_value1</m:e1>
         <m:e2>some_value2</m:e2>
         <m:e3>some_value3</m:e3>
    </m:customerData>
</xsl:param>

これまでのところ、次のXSLT構成を試しましたが成功しませんでした。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no"/>
    <xsl:param name="testParam">
        <![CDATA[<m:customerData xmlns:m="http://cclk.lk">
    <m:e1>dfdf</m:e1>
    <m:e2>dfdf</m:e2>
    <m:e3>dfdf</m:e3></m:customer>]]>
    </xsl:param>
    <xsl:template match="/" xmlns:m="http://cclk.lk">
        <m:addCustomer>
            <xsl:value-of select="$testParam" disable-output-escaping="yes"/>
            <xsl:apply-templates select="m:customerData"/>
        </m:addCustomer>
    </xsl:template>

    <xsl:template match="m:customerData" xmlns:m="http://cclk.lk">
        <m:addUser>
            <xsl:for-each select="m:customer/*">
                <m:e1>
                    <xsl:value-of select="e1"/>
                </m:e1>
                <m:e2>
                    <xsl:value-of select="e2"/>
                </m:e2>
                <m:e3>
                    <xsl:value-of select="e3"/>
                </m:e3>
            </xsl:for-each>
        </m:addUser>
    </xsl:template>
</xsl:stylesheet>

現在、これを行う方法を見つけることができません。これに関する助けに感謝します。

よろしく、プラバス

4

1 に答える 1

2

指定されたパラメーター

<xsl:param name="testParam" xmlns:m="http://test.org">
    <m:customerData> 
         <m:e1>some_value1</m:e1>
         <m:e2>some_value2</m:e2>
         <m:e3>some_value3</m:e3>
    </m:customerData>
</xsl:param>

XSLT 1.0では、RTF(結果ツリーフラグメントが作成されます。これは非常に制限されたタイプであり、ほとんどすべての意味のあるXPath式の評価を禁止します。

解決策

xxx:node-set()RTFを通常のツリーに変換するベンダー提供の拡張関数を使用します。

この拡張関数名はベンダー定義の名前空間にあり、ベンダーごとに異なることに注意してください。

EXSLTで定義されているベンダーに依存しない実装を提供する試みがあります。

ext:node-set()

ここで、プレフィックスextは名前空間にバインドされていますhttp://exslt.org/common

.NETXslCompiledTransformを含むほとんどのXSLT1.0プロセッサは、を実装しext:node-set()ます。


拡張関数が必要ない場合の解決策は、次のdocument()ような標準のXSLT1.0関数を使用することです。

document('')/*/xsl:param[@name='testParam']
于 2012-09-17T12:54:55.737 に答える