0

XSLT変換を行いました。

私が欠けているのは nil 属性です。つまり、ソース要素に nil 要素が true の場合、それを宛先 XML にマップしたいということです。

<xsl:if 
test="string-length(soapenv:Envelope/soapenv:Body/b:getBLResponse/b:result/BResult:BLOut/Class:ID)=0">
    <xsl:attribute name="i:nil">true</xsl:attribute>
</xsl:if>

上記の if は特定の node に対して機能しますが、すべてのフィールドをチェックするのではなく、一般的なテンプレートとして作成したい

xml ノードを受け取るテンプレートを作成できる可能性があります。ノードが nil 属性を持っている場合は検証され、そうでない場合は nil 属性なしで返されます。

以下は例です

nil の場合: 入力:

<TEST>
    <Child i:nil="true">asdf</Child>
</TEST>
Output:

<TEST xmlns:i="whatever" >
    <OutputChild i:nil="true">asdf</OutputChild >
</TEST>

Without nil: Input + Output the same

<TEST>
    <OutputChild >example</OutputChild >
</TEST>
4

2 に答える 2

0

それを解決するために、マッピングノードと新しい要素名を受け取るテンプレートを書きました。要素が null かどうかを確認した後、テンプレートは nil 属性を返します

<xsl:template name="TransformNode" >
        <xsl:param name="pCurrentNode"/>
        <xsl:param name="elementName"/>
        <xsl:element name = "{$elementName}">
            <xsl:if test="$pCurrentNode/@i:nil='true'"><xsl:attribute name="nil">true</xsl:attribute></xsl:if>      
            <xsl:value-of select="$pCurrentNode"/>
        </xsl:element>
    </xsl:template>
于 2012-11-07T15:56:11.593 に答える
0

これがまさにあなたが探しているものかどうかはわかりません (お願い: 入力と必要な出力 XML を常に含めることを忘れないでください)。しかし、追加の処理を適用する前に、空のノードと属性を再帰的に検索する汎用テンプレートがあります ( 「または」の後の部分を削除するだけで、属性チェックは必要ありません):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:i="whatever">
    <xsl:output method="xml" indent="yes"/>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:variable name="nil">
                <xsl:apply-templates select="." mode="nil"/>
            </xsl:variable>
            <xsl:if test="$nil='true'">
                <xsl:attribute name="i:nil">true</xsl:attribute>
            </xsl:if>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="*" mode="nil">
        <xsl:choose>
            <xsl:when test="string-length(.)=0 or @*[string-length(.)=0]">
                <xsl:value-of select="'true'"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:apply-templates select="*" mode="nil"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

nil の場合: 入力:

<TEST>
    <Child test="aaa" secondtest="">asdf</Child>
</TEST>

出力:

<TEST xmlns:i="whatever" i:nil="true">
    <Child test="aaa" secondtest="">asdf</Child>
</TEST>

nil なし: 入力 + 出力 (何もしない):

<TEST>
    <Child test="aaa" secondtest="bbb">asdf</Child>
</TEST>
于 2012-11-07T13:56:23.087 に答える