2011-06-09 54 views
6

在XML文档中我有一些地址数据..我如何检查,如果XML值是nil在XSLT

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

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

只希望打扰显示拉链正值如果有值使用。 (就本例而言,我不在乎它是否为正确的zip加格式)

试图在XSLT中使用以下代码片段似乎没有问题,我认为它与我是怎么检查的的xsl:无

<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元素的正确方法是什么? 有没有其他的方法来解决这个问题,并得到我想要的结果?

回答

2

一些更多的测试之后,没有给出答案,这涉及检查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> 
+0

看到我的答案。我只用'not(zipPlus/@ xsi:nil)'测试,假设如果缺少属性,你需要zipplus。然而@ Jim-Garrison可以工作(即使在我的测试中,你需要用'xsi'替换前缀'xsl')。 – 2011-06-10 22:16:55

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

如果@xsl:无存在仅当该值是 “真”,则使用不'(zipPlus/@ XSL:无)',其测试属性的存在性。 – 2011-06-09 18:52:24

5

在XSLT 2.0,至于原因我从来没有完全理解,有一个自定义函数

test="not(nilled(zipPlus))" 
+0

visual studio中的xslt调试不知道nilled()函数。 – StingyJack 2011-06-10 19:50:16

+0

D'oh。刚刚意识到VS2010只支持XSLT 1.0。这是超级跛脚。无论如何谢谢@迈克尔凯 – StingyJack 2011-06-10 20:20:14

1

这很奇怪,你没有得到它的工作。也许它可能是你缺少名称空间声明或前缀更改xsixsl是你的变换中看不见的错字。检查更好。这里我的测试:

XSLT 1.0撒克逊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, 
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> 
相关问题