如果在XPATH中不存在节点,如何返回常量?

Szi*_*iro 3 xml xpath ssis

我有一个问题,请考虑以下XML:

<?xml version="1.0" encoding="UTF-16"?>
<APIDATA xmlns="api-com">
<ORDER EngineID="1" OrderID="66" OtherInfo="yes"><INSTSPECIFIER InstID="27" SeqID="17"/>     
</ORDER>
<ORDER EngineID="2" OrderID="67" OtherInfo="yes"><INSTSPECIFIER InstID="28" SeqID="18"/>    
</ORDER>
<ORDER EngineID="3" OrderID="68"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER>
</APIDATA>
Run Code Online (Sandbox Code Playgroud)

我必须与SSIS合作.我想在所有Order条目的每个循环中获取所有数据到SSIS变量.到目前为止,我可以使用SSIS中的控制流中的ForeachLoop获取数据,具体如下:

EnumerationType:  ElementCollection
OuterXPathString: //*[name() = 'ORDER']
InnerElementType: NodeText
InnerXPathString: @*[name() = 'EngineID'] | @*[name() = 'OrderID'] | child::node()/@*[name() = 'InstID'] | child::node()/@*[name() = 'SeqID']
Run Code Online (Sandbox Code Playgroud)

如何以这种方式获取OtherInfo数据,即使节点不存在,它总是会返回一些内容?例如,如果节点不存在,则返回"否".

在讨论方面,我需要这个,因为SSIS映射在结果集上使用整数索引.如果结果集可以是4或5长,我得到索引越界错误.这是我的想法,以避免问题,总是返回固定长度的结果集.

如果无法做到这一点,另一个想法是使用默认值扩展XML.所以如果另一个问题是:你能告诉我,如何使用XPATH将默认值添加到XML?示例:将提到的XML用于此:

<?xml version="1.0" encoding="UTF-16"?>
<APIDATA xmlns="api-com">
<ORDER EngineID="1" OrderID="66" OtherInfo="yes"><INSTSPECIFIER InstID="27" SeqID="17"/>     
</ORDER>
<ORDER EngineID="2" OrderID="67" OtherInfo="yes"><INSTSPECIFIER InstID="28" SeqID="18"/>    
</ORDER>
<ORDER EngineID="3" OrderID="68" OtherInfo="defaultvalue"><INSTSPECIFIER InstID="29" SeqID="19"/></ORDER>
</APIDATA>
Run Code Online (Sandbox Code Playgroud)

或者在SSIS中有更优雅的解决方法吗?

Dim*_*hev 7

如何以这种方式获取OtherInfo数据,即使节点不存在,它总是会返回一些内容?例如,如果节点不存在,则返回"否".

OtherInfo如果此属性存在,则以下是生成属性值的一种方法,"no"否则为字符串:

      concat(@OtherInfo,
             substring('no',1 + 2*boolean(@OtherInfo)))
Run Code Online (Sandbox Code Playgroud)

在以下元素上计算此Xpath 1.0表达式时:

    <ORDER EngineID="1" OrderID="66" OtherInfo="yes">
            <INSTSPECIFIER InstID="27" SeqID="17"/>
Run Code Online (Sandbox Code Playgroud)

结果是:

yes
Run Code Online (Sandbox Code Playgroud)

但是当评估相同的表达式时:

    <ORDER EngineID="3" OrderID="68">
            <INSTSPECIFIER InstID="29" SeqID="19"/>
Run Code Online (Sandbox Code Playgroud)

然后结果是:

no
Run Code Online (Sandbox Code Playgroud)

基于XSLT的验证:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*/*">
         <xsl:value-of select=
         "concat(@OtherInfo,
                 substring('no',1 + 2*boolean(@OtherInfo)))
         "/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

在提供的XML文档上应用此转换时:

<APIDATA xmlns="api-com">
        <ORDER EngineID="1" OrderID="66" OtherInfo="yes">
                <INSTSPECIFIER InstID="27" SeqID="17"/>
        </ORDER>
        <ORDER EngineID="2" OrderID="67" OtherInfo="yes">
                <INSTSPECIFIER InstID="28" SeqID="18"/>
        </ORDER>
        <ORDER EngineID="3" OrderID="68">
                <INSTSPECIFIER InstID="29" SeqID="19"/>
        </ORDER>
</APIDATA>
Run Code Online (Sandbox Code Playgroud)

针对每个ORDER元素计算Xpath表达式,并将评估结果复制到输出:

yesyesno
Run Code Online (Sandbox Code Playgroud)

说明:

表达方式:

      concat(@OtherInfo,
             substring('no',1 + 2*boolean(@OtherInfo)))
Run Code Online (Sandbox Code Playgroud)

产生两个字符串的串联.

如果上下文节点具有名为的属性OtherInfo,则第二个字符串是空字符串,并且仅生成第一个字符串(属性的值).

如果上下文节点没有命名属性OtherInfo,则第一个参数concat()是空字符串,第二个参数被计算并输出.

在以下两种情况中,如何评估此子表达式:

substring('no',1 + 2*boolean(@OtherInfo))
Run Code Online (Sandbox Code Playgroud)
  1. 如果@OtherInfo存在.那么2*boolean(@OtherInfo) = 2*true() = 2*1 = 2,表达式相当于:substring('no',3)这是空字符串,因为"no"它的长度只有2.

  2. 如果@OtherInfo不存在.然后2*boolean(@OtherInfo) = 2*false() = 2*0 = 0.因此,表达式等效于:substring('no',1)并且此计算结果为字符串"no".