从源XML获取nil值

时间:2012-11-07 12:54:02

标签: xslt xml-nil

我做了XSLT转换。

我缺少的是nil属性。我的意思是如果source元素的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 if for working for specific node,但我想把它作为通用模板, 不要检查每个字段

可能有可能创建接收xml节点的模板,如果node有nil属性则验证,它将返回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>

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>