【问题标题】:How to use xslt copy preceding nodes?如何使用 xslt 复制前面的节点?
【发布时间】:2013-02-18 05:15:52
【问题描述】:

我是 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>

看起来&lt;MetaData&gt;&lt;Order&gt; 的后代被复制了三遍.. 为什么&lt;tail&gt; 节点丢失了元素名称?

谁能帮我解决这个问题?谢谢

【问题讨论】:

  • 是否可以在问题中显示您的预期输出?谢谢!
  • @TimC 已编辑,谢谢提醒

标签: xml xslt


【解决方案1】:

如果要复制前两个节点,为什么不在 for-each 中明确选择它们,例如。 select="Order[position()&lt;=2]?

更新:这将选择直到并包括第二个 Order 元素的所有元素:

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

【讨论】:

  • 嗨 Michael,我不只是复制 Order 节点,我想复制 Order[2] 之前的所有节点(包括它自己)
  • select="*[count(preceding-sibling::Order)&lt;2]" :)
  • 我试过 '' 抛出错误..." 属性值 "与元素类型 "xsl:for-each" 关联的 select" 不得包含 '
  • 尝试用&amp;lt;替换&lt;
  • @MichaelDay:你想相应地更新你的答案吗?
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多