我有一个问题,请考虑以下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中有更优雅的解决方法吗?
如何以这种方式获取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)
如果@OtherInfo
存在.那么2*boolean(@OtherInfo) = 2*true() = 2*1 = 2
,表达式相当于:substring('no',3)
这是空字符串,因为"no"
它的长度只有2.
如果@OtherInfo
不存在.然后2*boolean(@OtherInfo) = 2*false() = 2*0 = 0
.因此,表达式等效于:substring('no',1)
并且此计算结果为字符串"no"
.
归档时间: |
|
查看次数: |
3234 次 |
最近记录: |