【发布时间】:2017-08-21 01:27:08
【问题描述】:
我有以下 XML 文档片段:
<document id="856" version="004010" direction="outbound">
<xpaths>
<xpath id="deliverAddressCode">//ib//Transaction[1]/Loop[@LoopId="N1"]/N1[N101="ST"][N103="ZZ"]/N104/text()</xpath>
</xpaths>
<schema>
<BSN BSN01="00" BSN02="{xpath::concat(substring(asn[1]/asnH[1]/senderId[1],1,5),asn[1]/asnH[1]/dino[1])}" BSN03="{xpath::.//asnH/date/text()}" BSN04="{xpath::.//asnH/time/text()}" />
<DTM DTM01="011" DTM02="{xpath::.//asnH/shipDate/text()}" />
<HL HL01="1" HL02="" HL03="S">
<TD1 TD101="PLT" TD102="{xpath::.//asnH/loadingQty/text()}" TD103="" TD104="" TD105="" TD106="N" TD107="{xpath::.//asnH/zWeight/text()}" TD108="KG" />
<TD5 TD501="" TD502="" TD503="" TD504="M" TD505="{sql::select [dbo].[fsLocalToRemoteMapping]('{xpath::.//asnH/baanId/text()}','{xpath::.//asnH/ISAusageIndicator}','forwardingAgents','{xpath::.//asnH/cfrw/text()}')}" />
<TD3 TD301="TL" TD302="" TD303="{xpath::.//asnH/trackingNo/text()}" />
<PER PER01="IC" PER02="?" PER03="EM" PER04="?@?.com" />
<N1 N101="SF" N102="{xpath:://sf/nama/text()}" N103="ZZ" N104="{xpath:://sf/cuno/text()}">
<N3_SF N301="{xpath:://sf/namc/text()}" />
<N4_SF N401="{xpath:://sf/cityName/text()}" N402="{xpath:://sf/prov/text()}" N403="{xpath:://sf/pstc/text()}" N404="{xpath:://sf/country/text()}" />
</N1>
<N1 N101="ST" N102="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N102/text()}" N103="ZZ" N104="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N104/text()}" />
</HL>
</schema>
<scripts>
<function id="fCDEC"> function fCDEC(x) { if(x >= 3500.00) return "002" ; else return "002"; }</function>
</scripts>
</document>
还有这个(上面的片段):
<schema>
<BSN BSN01="00" BSN02="{xpath::concat(substring(asn[1]/asnH[1]/senderId[1],1,5),asn[1]/asnH[1]/dino[1])}" BSN03="{xpath::.//asnH/date/text()}" BSN04="{xpath::.//asnH/time/text()}" />
<DTM DTM01="011" DTM02="{xpath::.//asnH/shipDate/text()}" />
<HL HL01="1" HL02="" HL03="S">
<TD1 TD101="PLT" TD102="{xpath::.//asnH/loadingQty/text()}" TD103="" TD104="" TD105="" TD106="N" TD107="{xpath::.//asnH/zWeight/text()}" TD108="KG" />
<TD5 TD501="" TD502="" TD503="" TD504="M" TD505="{sql::select [dbo].[fsLocalToRemoteMapping]('{xpath::.//asnH/baanId/text()}','{xpath::.//asnH/ISAusageIndicator}','forwardingAgents','{xpath::.//asnH/cfrw/text()}')}" />
<TD3 TD301="TL" TD302="" TD303="{xpath::.//asnH/trackingNo/text()}" />
<PER PER01="IC" PER02="? EDI Services" PER03="EM" PER04="?@?.com" />
<N1 N101="SF" N102="{xpath:://sf/nama/text()}" N103="ZZ" N104="{xpath:://sf/cuno/text()}">
<N3_SF N301="{xpath:://sf/namc/text()}" />
<N4_SF N401="{xpath:://sf/cityName/text()}" N402="{xpath:://sf/prov/text()}" N403="{xpath:://sf/pstc/text()}" N404="{xpath:://sf/country/text()}" />
</N1>
<N1 N101="ST" N102="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N102/text()}" N103="ZZ" N104="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N104/text()}" />
</HL>
</schema>
如何从第一个片段检索到第二个片段的文档 id,所以查询结果是:
<schema id="856">
<BSN BSN01="00" BSN02="{xpath::concat(substring(asn[1]/asnH[1]/senderId[1],1,5),asn[1]/asnH[1]/dino[1])}" BSN03="{xpath::.//asnH/date/text()}" BSN04="{xpath::.//asnH/time/text()}" />
<DTM DTM01="011" DTM02="{xpath::.//asnH/shipDate/text()}" />
<HL HL01="1" HL02="" HL03="S">
<TD1 TD101="PLT" TD102="{xpath::.//asnH/loadingQty/text()}" TD103="" TD104="" TD105="" TD106="N" TD107="{xpath::.//asnH/zWeight/text()}" TD108="KG" />
<TD5 TD501="" TD502="" TD503="" TD504="M" TD505="{sql::select [dbo].[fsLocalToRemoteMapping]('{xpath::.//asnH/baanId/text()}','{xpath::.//asnH/ISAusageIndicator}','forwardingAgents','{xpath::.//asnH/cfrw/text()}')}" />
<TD3 TD301="TL" TD302="" TD303="{xpath::.//asnH/trackingNo/text()}" />
<PER PER01="IC" PER02="? EDI Services" PER03="EM" PER04="?@?.com" />
<N1 N101="SF" N102="{xpath:://sf/nama/text()}" N103="ZZ" N104="{xpath:://sf/cuno/text()}">
<N3_SF N301="{xpath:://sf/namc/text()}" />
<N4_SF N401="{xpath:://sf/cityName/text()}" N402="{xpath:://sf/prov/text()}" N403="{xpath:://sf/pstc/text()}" N404="{xpath:://sf/country/text()}" />
</N1>
<N1 N101="ST" N102="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N102/text()}" N103="ZZ" N104="{xpath:://ib//Transaction[1]/Loop[@LoopId='N1']/N1[N101='ST'][N103='ZZ']/N104/text()}" />
</HL>
</schema>
使用的查询
--ALTER function [dbo].[fxDocSchema](@env varchar(10),@baanId varchar(10),@docId varchar(10)) returns xml as
begin
declare @baanId varchar(10)='010-000164',@env varchar(10)='test',@docId varchar(10)='856'
--return(
select t.c.query('.')
,t.c.query('schema')
from (select meta from EdiMeta where baanId=@baanId and env=Case Lower(@env) when 't' then 'test'
when 'p' then 'production'
else @env
end) f(x)
cross applyx.nodes('meta/partners/partner/documents/document[@id=sql:variable("@docId")]') t(c)
--)
end
【问题讨论】:
标签: sql-server sql-server-2008 tsql xpath xquery