如何在xslt中为非现有节点默认值

时间:2014-03-19 21:46:03

标签: xslt default-value

我在源代码中有以下xml元素,并希望映射到目标中的元素。

每当源中没有节点时,我想将其默认为字符串“None”

--------------------------源XML ------------------- ---------------------------

<?xml version="1.0" encoding="UTF-8"?>
<Instructions  InstructionType="Gen">Some Message</Instructions>
<Instructions  InstructionType="Test">Some Other Message</Instructions>

---------------------------转换XSL ------------------ --------------------

<xsl:if test='/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions/@InstructionType = "Gen"'>
    <xsl:choose>
        <xsl:when test='/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions[@InstructionType = "Gen"] != ""'>
            <ns0:siGen>
                <xsl:value-of select='substring(/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions[@InstructionType = "Gen"],1.0,199.0)'/>
            </ns0:siGen>
        </xsl:when>
        <xsl:when test="not(/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions[@InstructionType = 'Gen'])">
            <ns0:siGen>
                <xsl:text disable-output-escaping="no">None</xsl:text>
            </ns0:siGen>
        </xsl:when>
        <xsl:otherwise>
            <ns0:siGen>
                <xsl:text disable-output-escaping="no">None</xsl:text>
            </ns0:siGen>
        </xsl:otherwise>
    </xsl:choose>
</xsl:if> 

---------------------------------------------发出─ -------------------------------------------------- ----------

当源xml完全没有该节点时,如下所示(注释),我不能将值“None”默认为目标元素“ns0:siGen”

<!--Instructions  InstructionType="Gen">Some Message</Instructions-->

<Instructions  InstructionType="Test">Some Other Message</Instructions>

我不明白为什么以下情况不起作用:

<xsl:when test="not(/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions[@InstructionType = 'Gen'])">

请告知。

由于

瑜珈

1 个答案:

答案 0 :(得分:1)

XSLT示例中的第一行说明了这一点......

<xsl:if   
     test='/ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions/@InstructionType = "Gen"'>

即。您正在测试是否存在指令元素,其 InstructionType 等于&#34; Gen&#34;。因此,很明显,如果您对此说明元素发表评论,则该语句将为false,因此语句中的 xsl:choose 将不会被执行。

为简化起见,请考虑将指令元素放在变量

<xsl:variable name="gen" 
              select="ns1:OrderResponse/ns1:OrderResponseBody/ns1:OrderResponseProperties/ns1:Instructions[@InstructionType = 'Gen']" />

然后你可以用一个简单的 xsl:choose 来测试这个

 <ns0:siGen>
    <xsl:choose>
       <xsl:when test="$gen != ''"><xsl:value-of select="$gen" /></xsl:when>
       <xsl:otherwise>None</xsl:otherwise>
    </xsl:choose>
 <ns0:siGen>