我有两个源文件
<corporations>
<corporation>
<CorporationID>1044293</CorporationID>
<CorporationName>CorporationName1</CorporationName>
<CorporationNumber>CorporationNumber1</CorporationNumber>
<NVBusinessID>NVBusinessID1</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
<corporation>
<CorporationID>1044294</CorporationID>
<CorporationName>CorporationName2</CorporationName>
<CorporationNumber>CorporationNumber2</CorporationNumber>
<NVBusinessID>NVBusinessID2</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
<corporation>
<CorporationID>1044295</CorporationID>
<CorporationName>CorporationName3</CorporationName>
<CorporationNumber>CorporationNumber3</CorporationNumber>
<NVBusinessID>NVBusinessID3</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
</corporations>
和
<corporationActions>
<corporationAction>
<ActionID>5530960</ActionID>
<CorporationID>1044293</CorporationID>
<ActionDate>2008-05-03</ActionDate>
<ActionType>ActionType1</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>3</DocumentNumber>
<NumberofPages>1</NumberofPages>
</corporationAction>
<corporationAction>
<ActionID>5530974</ActionID>
<CorporationID>1044294</CorporationID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>ActionType2</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>2</DocumentNumber>
<NumberofPages>4</NumberofPages>
</corporationAction>
<corporationAction>
<ActionID>5530975</ActionID>
<CorporationID>1044294</CorporationID>
<ActionDate>2009-05-03</ActionDate>
<ActionType>ActionType3</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>2</DocumentNumber>
<NumberofPages>2</NumberofPages>
</corporationAction>
<corporationAction>
<ActionID>5530976</ActionID>
<CorporationID>1044295</CorporationID>
<ActionDate>2011-05-03</ActionDate>
<ActionType>ActionType4</ActionType>
<ActionNotes></ActionNotes>
<DocumentNumber>20110258778-91</DocumentNumber>
<NumberofPages>4</NumberofPages>
</corporationAction>
</corporationActions>
我需要从第一个文件中获取所有那些与CorporateID匹配的记录(作为Response),并从第二个文件中找到相应的CorporateID记录(它们可以是多个)并按以下格式打印
<sendCorporationActionDetailsVariable>
<corporationActions>
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID1</ns1:NVBusinessID>
<ns1:CorporationName>CorporationName1</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044293</ns1:CorporationID>
<ns1:ActionDate>04/05/2008</ns1:ActionDate>
<ns1:ActionType>Articles of Organization1</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID2</ns1:NVBusinessID>
<ns1:CorporationName>NVBusinessID2</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2011</ns1:ActionDate>
<ns1:ActionType>ActionType2</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID2</ns1:NVBusinessID>
<ns1:CorporationName>NVBusinessID2</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2010</ns1:ActionDate>
<ns1:ActionType>ActionType3</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID3</ns1:NVBusinessID>
<ns1:CorporationName>CorporationName3</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044295</ns1:CorporationID>
<ns1:ActionDate>04/05/2011</ns1:ActionDate>
<ns1:ActionType>ActionType4</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
</corporationActions>
</sendCorporationActionDetailsVariable>
以下是响应文件的一部分:
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID2</ns1:NVBusinessID>
<ns1:CorporationName>NVBusinessID2</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2011</ns1:ActionDate>
<ns1:ActionType>ActionType2</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID2</ns1:NVBusinessID>
<ns1:CorporationName>NVBusinessID2</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2010</ns1:ActionDate>
<ns1:ActionType>ActionType3</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
我需要以上格式
<ns1:corporationAction>
<ns1:NVBusinessID>NVBusinessID2</ns1:NVBusinessID>
<ns1:CorporationName>NVBusinessID2</ns1:CorporationName>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2011</ns1:ActionDate>
<ns1:ActionType>ActionType2</ns1:ActionType>
</ns1:corporationActionDetails>
<ns1:corporationActionDetails>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>04/05/2010</ns1:ActionDate>
<ns1:ActionType>ActionType3</ns1:ActionType>
</ns1:corporationActionDetails>
</ns1:corporationAction>
我编写了一个逻辑,循环遍历第一个文件和第二个文件,并比较corporationID并打印所需的信息。
<ns1:corporationActions>
<xsl:for-each select="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction">
<xsl:variable name="corpActPos" select="position()"/>
<xsl:for-each select="/tns:corporations/tns:corporation">
<xsl:variable name="corpPos" select="position()"/>
<xsl:if test="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction[$corpActPos]/ns0:CorporationID = /tns:corporations/tns:corporation[$corpPos]/tns:CorporationID">
<xsl:variable name="cntCorpId" select="count($InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction/ns0:CorporationID)"/>
<ns1:corporationAction>
<ns1:NVBusinessID>
<xsl:value-of select="/tns:corporations/tns:corporation[$corpPos]/tns:NVBusinessID"/>
</ns1:NVBusinessID>
<xsl:for-each select="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction[$corpActPos]/ns0:CorporationID">
<ns1:corporationActionDetails>
<ns1:CorporationID>
<xsl:value-of select="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction[$corpActPos]/ns0:CorporationID"/>
</ns1:CorporationID>
<ns1:ActionDate>
<xsl:value-of select="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction[$corpActPos]/ns0:ActionDate"/>
</ns1:ActionDate>
<ns1:ActionType>
<xsl:value-of select="$InvokeCorpActFileReaderOutputVariable.body/ns0:corporationActions/ns0:corporationAction[$corpActPos]/ns0:ActionType"/>
</ns1:ActionType>
</ns1:corporationActionDetails>
</xsl:for-each>
</ns1:corporationAction>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</ns1:corporationActions>
而不是这个,我需要一个XPATH表达式来处理这些。
答案 0 :(得分:0)
只有在评估单个XPath表达式时才能生成所需的输出。 XPath是XML文档的查询语言,因此,评估XPath表达式永远不会更改任何XML文档的结构,也永远不会修改任何XML文档中的任何节点。
您希望更改节点(例如新节点位于新名称空间中 - 前缀ns1:
已绑定到) - 这不能仅仅评估XPath表达式。
要执行此类转换,您不仅需要XPath,还需要托管XPath引擎的另一种语言 - 例如XSLT,XQuery或任何带有DOM API的编程语言。
这种转换可以使用XSLT以非常紧凑的方式编写:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="my:ns1" exclude-result-prefixes="ns1" >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="ActionByCorpId" match="corporationAction"
use="CorporationID"/>
<xsl:variable name="vDoc2" select="document('delete16.xml')"/>
<xsl:template match="/">
<sendCorporationActionDetailsVariable>
<corporationActions>
<xsl:apply-templates select="/*/*/CorporationID"/>
</corporationActions>
</sendCorporationActionDetailsVariable>
</xsl:template>
<xsl:template match="CorporationID">
<xsl:variable name="vId" select="."/>
<xsl:for-each select="$vDoc2/*">
<xsl:apply-templates mode="addNamespace"
select="key('ActionByCorpId',$vId)"/>
</xsl:for-each>
</xsl:template>
<xsl:template match="node()|@*" mode="addNamespace">
<xsl:copy>
<xsl:apply-templates select="node()|@*" mode="addNamespace"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*" mode="addNamespace">
<xsl:element name="ns1:{name()}" namespace="my:ns1">
<xsl:apply-templates select="node()|@*" mode="addNamespace"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<corporations>
<corporation>
<CorporationID>1044293</CorporationID>
<CorporationName>CorporationName1</CorporationName>
<CorporationNumber>CorporationNumber1</CorporationNumber>
<NVBusinessID>NVBusinessID1</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
<corporation>
<CorporationID>1044294</CorporationID>
<CorporationName>CorporationName2</CorporationName>
<CorporationNumber>CorporationNumber2</CorporationNumber>
<NVBusinessID>NVBusinessID2</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
<corporation>
<CorporationID>1044295</CorporationID>
<CorporationName>CorporationName3</CorporationName>
<CorporationNumber>CorporationNumber3</CorporationNumber>
<NVBusinessID>NVBusinessID3</NVBusinessID>
<BusinessLicenseExp>2011-04-05T12:12:12</BusinessLicenseExp>
</corporation>
</corporations>
产生了想要的正确结果:
<sendCorporationActionDetailsVariable>
<corporationActions>
<ns1:corporationAction xmlns:ns1="my:ns1">
<ns1:ActionID>5530960</ns1:ActionID>
<ns1:CorporationID>1044293</ns1:CorporationID>
<ns1:ActionDate>2008-05-03</ns1:ActionDate>
<ns1:ActionType>ActionType1</ns1:ActionType>
<ns1:ActionNotes/>
<ns1:DocumentNumber>3</ns1:DocumentNumber>
<ns1:NumberofPages>1</ns1:NumberofPages>
</ns1:corporationAction>
<ns1:corporationAction xmlns:ns1="my:ns1">
<ns1:ActionID>5530974</ns1:ActionID>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>2009-05-03</ns1:ActionDate>
<ns1:ActionType>ActionType2</ns1:ActionType>
<ns1:ActionNotes/>
<ns1:DocumentNumber>2</ns1:DocumentNumber>
<ns1:NumberofPages>4</ns1:NumberofPages>
</ns1:corporationAction>
<ns1:corporationAction xmlns:ns1="my:ns1">
<ns1:ActionID>5530975</ns1:ActionID>
<ns1:CorporationID>1044294</ns1:CorporationID>
<ns1:ActionDate>2009-05-03</ns1:ActionDate>
<ns1:ActionType>ActionType3</ns1:ActionType>
<ns1:ActionNotes/>
<ns1:DocumentNumber>2</ns1:DocumentNumber>
<ns1:NumberofPages>2</ns1:NumberofPages>
</ns1:corporationAction>
<ns1:corporationAction xmlns:ns1="my:ns1">
<ns1:ActionID>5530976</ns1:ActionID>
<ns1:CorporationID>1044295</ns1:CorporationID>
<ns1:ActionDate>2011-05-03</ns1:ActionDate>
<ns1:ActionType>ActionType4</ns1:ActionType>
<ns1:ActionNotes/>
<ns1:DocumentNumber>20110258778-91</ns1:DocumentNumber>
<ns1:NumberofPages>4</ns1:NumberofPages>
</ns1:corporationAction>
</corporationActions>
</sendCorporationActionDetailsVariable>