6

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

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

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

如果有要使用的值,则只想打扰显示 zip 加值。(出于本示例的目的,我不在乎它是否是正确的 zip plus 格式)

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

4

5 回答 5

6
<xsl:if test="not(zipPlus/@xsi:nil='true')">
于 2011-06-09T16:40:14.363 回答
5

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

test="not(nilled(zipPlus))"
于 2011-06-09T20:04:39.883 回答
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>
于 2011-06-10T20:04:15.167 回答
1

很奇怪你没有让它工作。可能是您缺少命名空间声明,或者前缀更改xsixsl您的转换中看不见的错字。检查更好。这是我的测试:

XSLT 1.0Saxon 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,
于 2011-06-10T22:12:54.233 回答
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>
于 2011-10-18T09:41:48.620 回答