Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 条件未标识空元素时的XSL_Xml_Xslt - Fatal编程技术网

Xml 条件未标识空元素时的XSL

Xml 条件未标识空元素时的XSL,xml,xslt,Xml,Xslt,“何时”条件未正确识别空元素。所需的输出应显示“EMPTYAddress2”属性。我也尝试过各种“不”条件,但运气不佳。请帮帮我,我是新手。我正在使用Oxygen XML Developer,没有返回任何错误 XML源文件: <InterfaceData> <OBJECT_ACTION_ID>16283</OBJECT_ACTION_ID> <Employee> <Employee>

“何时”条件未正确识别空元素。所需的输出应显示“EMPTYAddress2”属性。我也尝试过各种“不”条件,但运气不佳。请帮帮我,我是新手。我正在使用Oxygen XML Developer,没有返回任何错误

XML源文件:

<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
上为每个组
执行
,并且只会有其中一个。这不是你要讨论的问题。太棒了,谢谢你的解释。对像我这样的新手来说太有好处了!我有