2013-02-18 2 views
0

Я новичок в XSLT. Я хочу, чтобы скопировать все предыдущие узлы одного конкретного узла, я попытался с копией и предшествующая, но выход не то, что я ожидал ..Как использовать 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> копируются три раза .. и почему <tail> узла потерял имя элемента?

Может ли кто-нибудь помочь мне с этим? Спасибо

+0

Можно ли показать свой ожидаемый результат в этом вопросе? Благодаря! –

+0

@TimC Отредактировано, спасибо за ваш отзыв – alvan

ответ

0

Если вы хотите скопировать первые два узла, почему бы не выбрать их явно для каждого из них, например. select="Order[position()<=2]?

Обновление: Это позволит выбрать все элементы вплоть до и включая второй элемент заказа:

select="*[count(preceding-sibling::Order) &lt; 2] 
+0

Привет, Майкл, я не просто копирую узел заказа, я хочу скопировать все узлы перед заказом [2] (включая себя) – alvan

+0

'select =" * [count (previous-sibling :: Order) <2] "' :) –

+0

Я попробовал '', которые выдают ошибку ..." Значение атрибута " select ", связанный с типом элемента" xsl: for-each "не должен содержать символ '<'. – alvan

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