Xpath表达式,用于根据id循环来自不同文件的记录

时间:2011-05-04 11:09:53

标签: xslt xpath

我有两个源文件

<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表达式来处理这些。

1 个答案:

答案 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>