0

我正在努力寻找解决 XML 消息提取问题的方法。我所拥有的与以下 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 元素值检索 Order 零件。

谢谢。

尝试了以下解决方案并且都有效。确实找到了另一个同样有效的解决方案。它不使用 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>

谢谢。

4

2 回答 2

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添加一个身份转换,然后用模板覆盖它以处理特定的部分。

于 2013-07-11T02:30:58.213 回答
0

这是一个 XSLT 1.0 解决方案,它通过 EXSLT 扩展函数将每个 @OrderRef 组输出到一个单独的文档(例如,“D04004452.xml”)中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/>.

于 2013-07-11T02:22:35.520 回答