Xml 条件未标识空元素时的XSL
“何时”条件未正确识别空元素。所需的输出应显示“EMPTYAddress2”属性。我也尝试过各种“不”条件,但运气不佳。请帮帮我,我是新手。我正在使用Oxygen XML Developer,没有返回任何错误 XML源文件:Xml 条件未标识空元素时的XSL,xml,xslt,Xml,Xslt,“何时”条件未正确识别空元素。所需的输出应显示“EMPTYAddress2”属性。我也尝试过各种“不”条件,但运气不佳。请帮帮我,我是新手。我正在使用Oxygen XML Developer,没有返回任何错误 XML源文件: <InterfaceData> <OBJECT_ACTION_ID>16283</OBJECT_ACTION_ID> <Employee> <Employee>
<InterfaceData>
<OBJECT_ACTION_ID>16283</OBJECT_ACTION_ID>
<Employee>
<Employee>
<EmployeeBasic>
<EmployeeNo>50064</EmployeeNo>
</EmployeeBasic>
<EmployeeBasic_DateMarriageCeased>
<PersonDetailsRecords>
<PersonDetails>
<DateMarriageCeased/>
</PersonDetails>
</PersonDetailsRecords>
</EmployeeBasic_DateMarriageCeased>
<EmployeeAddress>
<AddressRecords>
<AddressDetails>
<Address1>Line1</Address1>
<Address2/>
<Address3>Line3</Address3>
<Address4>Line4</Address4>
<Postcode>Postcode</Postcode>
</AddressDetails>
</AddressRecords>
</EmployeeAddress>
</Employee>
</Employee>
</InterfaceData>
16283
50064
第1行
第3行
第4行
邮政编码
XSL样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="/">
<xsl:for-each-group select="//InterfaceData" group-by="OBJECT_ACTION_ID">
<!-- Employee -->
<EmployeeAddress>
<xsl:for-each select="current-group()//AddressDetails">
<xsl:call-template name="CGIderiveAddress">
<xsl:with-param name="myVarAddress1" select="current-group()//Address1/text()"/>
<xsl:with-param name="myVarAddress2" select="current-group()//Address2/text()"/>
<xsl:with-param name="myVarAddress3" select="current-group()//Address3/text()"/>
<xsl:with-param name="myVarAddress4" select="current-group()//Address4/text()"/>
<xsl:with-param name="myVarPostcode" select="current-group()//Postcode/text()"/>
</xsl:call-template>
</xsl:for-each>
</EmployeeAddress>
</xsl:for-each-group>
</xsl:template>
<xsl:template name="CGIderiveAddress">
<xsl:param name="myVarAddress1"/>
<xsl:param name="myVarAddress2"/>
<xsl:param name="myVarAddress3"/>
<xsl:param name="myVarAddress4"/>
<xsl:param name="myVarPostcode"/>
<xsl:attribute name="Address1">
<xsl:value-of select="$myVarAddress1"/>
</xsl:attribute>
<xsl:choose>
<!-- Address Line 2 is empty and Adress Line 3 exists -->
<xsl:when test="$myVarAddress2 = ''">
<xsl:attribute name="EMPTYAddress2">
<xsl:value-of select="'EMPTYAddress2'"/>
</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="NotEMPTYAddress2">
<xsl:value-of select="'NotEMPTYAddress2'"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
XSL输出:
<?xml version="1.0" encoding="UTF-8"?>
<EmployeeAddress Address1="Line1"
NotEMPTYAddress2="NotEMPTYAddress2"/>
您正在定义
myVarAddress2
就像这样
<xsl:with-param name="myVarAddress2" select="current-group()//Address2/text()"/>
<xsl:with-param name="myVarAddress2" select="Address2/text()"/>
注意,我看不出分组是如何进入XSLT的,尤其是因为InterfaceData
是根元素
另外,对于问题中显示的XSLT,您可以简化参数,如下所示
<xsl:with-param name="myVarAddress2" select="current-group()//Address2/text()"/>
<xsl:with-param name="myVarAddress2" select="Address2/text()"/>
您正在定义
myVarAddress2
就像这样
<xsl:with-param name="myVarAddress2" select="current-group()//Address2/text()"/>
<xsl:with-param name="myVarAddress2" select="Address2/text()"/>
注意,我看不出分组是如何进入XSLT的,尤其是因为InterfaceData
是根元素
另外,对于问题中显示的XSLT,您可以简化参数,如下所示
<xsl:with-param name="myVarAddress2" select="current-group()//Address2/text()"/>
<xsl:with-param name="myVarAddress2" select="Address2/text()"/>
使用/text()
几乎总是一个错误。在这种情况下,如果Address2元素存在并且没有子元素,则Address2/text()是一个空序列(不是长度为零的字符串值的节点!);当您测试空序列是否与任何内容相等时,即使是长度为零的字符串,结果始终为false
我认为模板CGIderiveAddress
希望其所有参数都是字符串,因此最好在xsl:param
元素上使用as=“xs:string”将其声明为字符串。如果您这样做了,您将收到一条错误消息,指出您正在提供一个不允许的空序列。错误消息总是比不正确的结果好,实现错误消息的一个好方法是声明所有变量和(特别是)参数的类型
然后简单地使用
。由于预期值是字符串,Address2元素将被原子化并转换为字符串,如果Address2元素为空,则该字符串将为零长度字符串。如果在Address2不存在时还需要长度为零的字符串,请使用string(current-group()//Address2)
仔细查看代码,这里还有另一个明显的错误:
<xsl:for-each select="current-group()//AddressDetails">
<xsl:call-template name="CGIderiveAddress">
<xsl:with-param name="myVarAddress1"
select="current-group()//Address1/text()"/>
使用/text()
几乎总是一个错误。在这种情况下,如果Address2元素存在并且没有子元素,则Address2/text()是一个空序列(不是长度为零的字符串值的节点!);当您测试空序列是否与任何内容相等时,即使是长度为零的字符串,结果始终为false
我认为模板CGIderiveAddress
希望其所有参数都是字符串,因此最好在xsl:param
元素上使用as=“xs:string”将其声明为字符串。如果您这样做了,您将收到一条错误消息,指出您正在提供一个不允许的空序列。错误消息总是比不正确的结果好,实现错误消息的一个好方法是声明所有变量和(特别是)参数的类型
然后简单地使用
。由于预期值是字符串,Address2元素将被原子化并转换为字符串,如果Address2元素为空,则该字符串将为零长度字符串。如果在Address2不存在时还需要长度为零的字符串,请使用string(current-group()//Address2)
仔细查看代码,这里还有另一个明显的错误:
<xsl:for-each select="current-group()//AddressDetails">
<xsl:call-template name="CGIderiveAddress">
<xsl:with-param name="myVarAddress1"
select="current-group()//Address1/text()"/>
当每个组都没有任何
时,使用current-group()
毫无意义。恐怕每个组都有,没有任何groupby
或group nexted
或以/结尾的组也没有意义。如果分组不相关,请花时间准备一个最小但完整的样本,让我们用您的输入、您得到的输出和您想要的结果重现问题。此外,您在根元素AddressRecords
上为每个组执行,并且只会有其中一个。这不是您要分组的内容。使用current-group()
当每个组都没有任何时
毫无意义。我担心每个组的没有任何groupby
或groupinnexted
或以/结尾的组也没有意义。如果分组不相关,请花时间准备一个最小但完整的样本,让我们用您的输入、您得到的输出和您想要的结果重现问题。此外,您在根元素AddressRecords
上为每个组执行,并且只会有其中一个。这不是你要讨论的问题。太棒了,谢谢你的解释。对像我这样的新手来说太有好处了!我有