如何在XSLT中检查XML值是否为nil

时间:2011-06-09 16:20:21

标签: xml xslt null xml-nil

在XML文档中,我有一些地址数据..

<zip>08001</zip>
<zipPlus xsi:nil="true" />

<zip>08002</zip>
<zipPlus>4512</zipPlus>

On只想在需要使用值时显示zip plus值。 (出于本例的目的,我不在乎它是否是正确的zip加格式)

尝试在XSLT中使用以下代码段似乎无法正常工作,我认为这与我如何检查 xsl:nil

有关
<EmployerZipCode>
      <xsl:value-of select="zip"/>
      <xsl:if test="zipPlus != @xsl:nil">
        <xsl:value-of select="'-'"/>
        <xsl:value-of select="zipPlus"/>
      </xsl:if>
      <xsl:value-of select="$sepChar"/> <!--this is a comma -->
</EmployerZipCode>

我得到的结果总是

08001,
08002,

不是

08001,
08002-4512,

在XSLT中检查nil-led元素的正确方法是什么? 有没有其他方法可以解决这个问题,并得到我想要的结果?

5 个答案:

答案 0 :(得分:6)

<xsl:if test="not(zipPlus/@xsi:nil='true')">

答案 1 :(得分:5)

在XSLT 2.0中,由于我从未完全理解的原因,有一个自定义函数

test="not(nilled(zipPlus))"

答案 2 :(得分:3)

经过一些更多的测试后,没有一个涉及检查nil属性的答案可靠地工作。

我不得不求助于使用string-length()来获得我需要的结果。

<EmployerZipCode>
  <xsl:value-of select="zip"/>
  <xsl:if test="string-length(zipPlus) &gt; 0">
    <xsl:value-of select="'-'"/>
    <xsl:value-of select="zipPlus"/>
  </xsl:if>
  <xsl:value-of select="$sepChar"/>
</EmployerZipCode>

答案 3 :(得分:1)

很奇怪,你没有让它发挥作用。也许可能是您缺少名称空间声明或前缀更改xsixsl是您的转换中看不见的拼写错误。检查更好。在这里我的测试:

XSLT 1.0 Saxon 6.5

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xsi="test">
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="EmployerZipCode">
        <EmployerZipCode>
            <xsl:value-of select="zip"/>
            <xsl:if test="not(zipPlus/@xsi:nil)">
                <xsl:value-of select="'-'"/>
                <xsl:value-of select="zipPlus"/>
            </xsl:if>
            <xsl:value-of select="','"/> <!--this is a comma -->
        </EmployerZipCode>
    </xsl:template>
</xsl:stylesheet>

鉴于输入:

<?xml version="1.0" encoding="utf-8"?>
<test xmlns:xsi="test">
    <EmployerZipCode>
        <zip>08001</zip>
        <zipPlus xsi:nil="true" />
    </EmployerZipCode>
    <EmployerZipCode>
        <zip>08002</zip>
        <zipPlus>4512</zipPlus>
    </EmployerZipCode>
</test>

产地:

08001,
08002-4512,

答案 4 :(得分:1)

它对我有用

源XML:

            <zipPlus xsi:nil="true"/>
                      or
            <zipPlus>123456</zipPlus>

XSLT:

            <xsl:if test="not(zipPlus/@xsl:nil='true')">
                <xsl:value-of select="zipPlus"/>
            </xsl:if>

结果XML

            <zipPlus/>
            or
            <zipPlus>123456</zipPlus>