2013-07-11 67 views
0

我正在努力尋找XML消息提取問題的解決方案。 我所擁有的是下面的XML消息的相似:XSLT選擇XML消息的一部分

<Orders xmlns="http://AU.InputOrders"> 
<Order> 
<OrderRef>D04004451</OrderRef> 
<OrderQty>5</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004451</OrderRef> 
<OrderQty>1</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>1</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>4</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>2</OrderQty> 
</Order> 
</Orders> 

我需要一個XSLT只得到該位:

<Orders xmlns="http://AU.InputOrders"> 
<Order> 
<OrderRef>D04004451</OrderRef> 
<OrderQty>5</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004451</OrderRef> 
<OrderQty>1</OrderQty> 
</Order> 
</Orders> 

<Orders xmlns="http://AU.InputOrders"> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>1</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>4</OrderQty> 
</Order> 
<Order> 
<OrderRef>D04004452</OrderRef> 
<OrderQty>2</OrderQty> 
</Order> 
</Orders> 

換句話說,我需要根據OrderRef元素值檢索訂單部件。

謝謝。

試過下面的解決方案和兩個作品。 找到了另一種解決方案。它不使用OrderRef,而是使用Order元素的位置。仍然這個正在做我所需要的。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ns0="http://AU.InputOrders"> 
<xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> 
<xsl:template match="/"> 
    <xsl:element name="Orders" namespace="http://AU.InputOrders"> 
    <xsl:copy-of select="ns0:Orders/ns0:Order[position() &gt;= 1 and position() &lt;=2]"/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

謝謝。

+0

您的解決方案根本不使用'OrderRef';那不是你的要求之一嗎?您的解決方案僅適用於您需要的'Order'元素碰巧是'訂單'中的前2個元素。 –

+0

這是真的,但後來我意識到如果我將使用Order元素位置而不是OrderRef,會對我的問題更好。我在這裏發佈了使用固定位置的解決方案,但在現實生活中,我通過代碼中的System.String.Format來傳遞這些位置。 –

回答

0

這是一個相當簡單的樣式表,它可以滿足你的要求。 (它使用該參數的默認值,但可以覆蓋。)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:au="http://AU.InputOrders"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:param name="orderRef" select="'D04004451'"/> 

    <xsl:template match="/*"> 
     <xsl:copy> 
      <xsl:copy-of select="au:Order[au:OrderRef=$orderRef]"/>   
     </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

如果你需要做額外的處理,更換xsl:copy-ofxsl:apply-templates,添加一個identity transform,並覆蓋使用模板來處理特定的件。

0

下面是一個XSLT 1.0溶液,每個@OrderRef組輸出到一個單獨的文件(例如, 「D04004452.xml」)經由EXSLT擴展函數exsl:document

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:au="http://AU.InputOrders" 
    xmlns:exsl="http://exslt.org/common" 
    extension-element-prefixes="exsl" 
    version="1.0"> 

    <xsl:key name="kOR" match="au:Order" use="au:OrderRef"/> 

    <xsl:template match="/"> 
     <xsl:for-each select="//au:Order[ generate-id(.) = generate-id(key('kOR', au:OrderRef)[1]) ]"> 
      <xsl:call-template name="handle-group"> 
       <xsl:with-param name="order-ref" select="au:OrderRef"/> 
      </xsl:call-template> 
     </xsl:for-each> 
    </xsl:template> 

    <xsl:template name="handle-group"> 
     <xsl:param name="order-ref"/> 
     <xsl:variable name="fn" select="concat($order-ref,'.xml')"/> 
     <exsl:document 
      href="{$fn}" 
      method="xml" 
      indent="yes"> 
      <xsl:element name="Orders" namespace="http://AU.InputOrders"> 
       <xsl:for-each select="//au:Order[au:OrderRef=$order-ref]"> 
        <xsl:copy-of select="."/> 
       </xsl:for-each> 
      </xsl:element> 
     </exsl:document> 
    </xsl:template> 

</xsl:stylesheet> 

如果有XSLT 2.0處理器,您可以使用<xsl:result-document/>而不是<exsl:document/>