在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元素的正确方法是什么? 有没有其他方法可以解决这个问题,并得到我想要的结果?
答案 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) > 0">
<xsl:value-of select="'-'"/>
<xsl:value-of select="zipPlus"/>
</xsl:if>
<xsl:value-of select="$sepChar"/>
</EmployerZipCode>
答案 3 :(得分:1)
很奇怪,你没有让它发挥作用。也许可能是您缺少名称空间声明或前缀更改xsi
到xsl
是您的转换中看不见的拼写错误。检查更好。在这里我的测试:
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>