2011-05-04 16 views
0

我有兩個源文件用於循環從不同的文件記錄的XPath表達式的ID

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

我需要把所有這些記錄(如響應)從1號文件匹配CorporationID並從第二個文件中找到相應的公司ID記錄(它們可以是多個)並以以下格式打印:

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

我已經寫了邏輯通過換每個第一文件,並且其循環第二個文件並比較公司ID並打印所需的信息。

<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

想要的輸出不能僅作爲評估單個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> 
+0

嗨,感謝您的快速幫助 – 2011-05-04 14:48:49

+0

當我在xmlspy中測試了上面的代碼時,我得到了一個空的響應(創建了delted16.xml並放在相同的文件夾中... – 2011-05-04 15:26:01

+0

delete16.xml文件必須與xslt位於同一文件夾中文件。否則,絕對URL必須在'document()'函數中提供。 – 2011-05-04 15:53:19