0

私は XSLT が初めてです。特定のノードのすべての先行ノードをコピーしたいのですが、コピーと先行で試しましたが、出力は期待したものではありません..

ソースの例の XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <MetaData>
      <Owner>adad</Owner>
      <date>2013-1-12</date>
   </MetaData>
   <Orders>
      <Order name="123">
         <OrderName>Order1</OrderName>
         <OrderNo>1</OrderNo>
      </Order>
      <Order name="1234">
         <OrderName>Order2</OrderName>
         <OrderNo>2</OrderNo>
      </Order>
      <Order>
         <OrderName>Order3</OrderName>
         <OrderNo>3</OrderNo>
      </Order>
   </Orders>
   <tail>1111</tail>
</root>

Xsl:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:output method="xml" indent="yes"/>

<xsl:template match = "Orders" name="split">
    <xsl:for-each select="Order">
    <xsl:if test="position() = 2">
        <xsl:copy-of select="preceding::node()"/>
        <xsl:copy-of select="."/>
    </xsl:if>
    </xsl:for-each>
</xsl:template> 
</xsl:stylesheet>

出力:

<?xml version="1.0" encoding="UTF-8"?>

      adad
      2013-1-12


   <MetaData>
      <Owner>adad</Owner>
      <date>2013-1-12</date>
   </MetaData>
      <Owner>adad</Owner>adad
      <date>2013-1-12</date>2013-1-12


      <Order name="123">
         <OrderName>Order1</OrderName>
         <OrderNo>1</OrderNo>
      </Order>
         <OrderName>Order1</OrderName>Order1
         <OrderNo>1</OrderNo>1

      <Order name="1234">
         <OrderName>Order2</OrderName>
         <OrderNo>2</OrderNo>
      </Order>
   1111

予期される XML:

<?xml version="1.0" encoding="UTF-8"?>
    <root>
       <MetaData>
          <Owner>adad</Owner>
          <date>2013-1-12</date>
       </MetaData>
       <Orders>
          <Order name="123">
             <OrderName>Order1</OrderName>
             <OrderNo>1</OrderNo>
          </Order>
          <Order name="1234">
             <OrderName>Order2</OrderName>
             <OrderNo>2</OrderNo>
          </Order>
        <Orders>
   </root>

<MetaData>の子孫のように見え、<Order>3回コピーされます..そして、<tail>ノードが要素名を失ったのはなぜですか?

誰でもこれで私を助けることができますか?ありがとう

4

1 に答える 1

0

最初の 2 つのノードをコピーする場合は、for-each でそれらを明示的に選択しないでください。select="Order[position()<=2]?

Update: This will select all elements up to and including the second Order element:

select="*[count(preceding-sibling::Order) &lt; 2]
于 2013-02-18T05:48:38.563 に答える