2013-07-11 5 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 в' Orders'. –

+0

Это правда, но позже я понял, что было бы лучше для моей проблемы, если я буду использовать позицию элемента Order вместо OrderRef. Я разместил здесь решение с использованием фиксированных позиций, но в реальной жизни я передаю эти позиции через t.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-of с xsl: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/>.

Смежные вопросы