Xslt для каждого и соответствие ключа - PullRequest
0 голосов
/ 07 октября 2010

У меня есть два источника данных xml, таких как:

<orders>
 <order>
  <ordernumber>123</ordernumber>
  <subtotal>20</subtotal>
  <total>23.5</total>
 </order>
  <order>
  <ordernumber>234</ordernumber>
  <subtotal>19</subtotal>
  <total>26.5</total>
 </order>
</orders>

<orderitems>
 <item>
  <ordernumber>123</ordernumber>
  <productname>test1</productname>
  <sku>s9sdidk</sku>
 <item>
 <item>
  <ordernumber>123</ordernumber>
  <productname>test2</productname>
  <sku>123232</sku>
 <item>
 <item>
  <ordernumber>234</ordernumber>
  <productname>test3</productname>
  <sku>s9sd2d32k</sku>
 <item>
 <item>
  <ordernumber>234</ordernumber>
  <productname>test4</productname>
  <sku>s9swe23</sku>
 <item>
</orderitems>

, и затем мне нужно использовать xslt для группировки товаров по номеру заказа и получения такого вывода:

productname               sku
test1                     s9sdidk
test2                     123232
---------------------------------
   subtotal: 20
   total: 23.5

productname               sku
test3                     s9sd2d32k
test4                     s9swe23
---------------------------------
   subtotal: 19
   total: 26.5

Мне нужно использовать HTML-теги, поэтому я не могу использовать для каждой группы вещи ... пожалуйста, помогите!заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 октября 2010

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:key name="kitemByOrder" match="item" use="ordernumber"/>

 <xsl:param name="pmaxSize" select="100"/>

 <xsl:template match="*">
  <xsl:apply-templates />
 </xsl:template>

 <xsl:template match="order">
productname<xsl:text>&#9;</xsl:text>sku
<xsl:apply-templates select="key('kitemByOrder', ordernumber)"/>
 ---------------------------------
   subtotal: <xsl:value-of select="subtotal"/>
   total: <xsl:value-of select="total"/>
   <xsl:text>&#xA;&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="item">
  <xsl:value-of select="concat(productname, '&#9;&#9;', sku, '&#xA;')"/>
 </xsl:template>

 <xsl:template match="orderitems"/>
</xsl:stylesheet>

при применении к предоставленному XML-документу (исправлено, поскольку оно было неправильно сформировано):

<t>
    <orders>
        <order>
            <ordernumber>123</ordernumber>
            <subtotal>20</subtotal>
            <total>23.5</total>
        </order>
        <order>
            <ordernumber>234</ordernumber>
            <subtotal>19</subtotal>
            <total>26.5</total>
        </order>
    </orders>
    <orderitems>
        <item>
            <ordernumber>123</ordernumber>
            <productname>test1</productname>
            <sku>s9sdidk</sku>
        </item>
        <item>
            <ordernumber>123</ordernumber>
            <productname>test2</productname>
            <sku>123232</sku>
        </item>
        <item>
            <ordernumber>234</ordernumber>
            <productname>test3</productname>
            <sku>s9sd2d32k</sku>
        </item>
        <item>
            <ordernumber>234</ordernumber>
            <productname>test4</productname>
            <sku>s9swe23</sku>
        </item>
    </orderitems>
</t>

дает требуемый, правильный результат :

productname sku
test1       s9sdidk
test2       123232

 ---------------------------------
   subtotal: 20
   total: 23.5


productname sku
test3       s9sd2d32k
test4       s9swe23

 ---------------------------------
   subtotal: 19
   total: 26.5

Примечание : вы можете использовать два разных XML-документа для двух источников данных, нообработка в основном та же, за исключением того, что вам нужно обратиться к одному из них с помощью функции document().

0 голосов
/ 07 октября 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:key name="kItemByOrdernumber" match="item" use="ordernumber"/>
    <xsl:variable name="vSource2" select="document('source2.xml')"/>
    <xsl:template match="text()"/>
    <xsl:template match="order/ordernumber">
        <xsl:variable name="vCurrent" select="."/>
        <xsl:text>productname&#x9;&#x9;sku&#xA;</xsl:text>
        <xsl:for-each select="$vSource2">
            <xsl:apply-templates
                     select="key('kItemByOrdernumber',$vCurrent)"/>
        </xsl:for-each>
        <xsl:value-of 
             select="concat('---------------------------------','&#xA;',
                            '&#x9;subtotal: ',../subtotal,'&#xA;',
                            '&#x9;total: ',../total,'&#xA;&#xA;')"/>
    </xsl:template>
    <xsl:template match="item">
        <xsl:value-of select="concat(productname,'&#x9;&#x9;&#x9;',
                                     sku,'&#xA;')"/>
    </xsl:template>
</xsl:stylesheet>

С первым документом в качестве ввода и вторым документом в качестве source2.xml внешнего ввода, вывод:

productname     sku
test1           s9sdidk
test2           123232
---------------------------------
    subtotal: 20
    total: 23.5

productname     sku
test3           s9sd2d32k
test4           s9swe23
---------------------------------
    subtotal: 19
    total: 26.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...