获取元素的父级时出现XSLT XPath问题

时间:2014-09-17 05:30:15

标签: xml xslt xpath

我是xslt的新手,我正在编写一个xslt来替换一个节点的值,其值为某个其他节点。 XML如下,

<Orders>
    <Order>
       <ShipAddress>
          <EMail>a@b.com</EMail>
       </ShipAddress>

       <OrderData>
          <Description>xxxx</Description>
       </OrderData>
    </Order>

    <Order>
    ......
    </Order>

</Orders>

我想为每个订单替换Description with Email的值。我在xslt下创建了转换。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
   <xsl:template match="Orders/Order/OrderData/Description/text()">
     <xsl:value-of select="../../ShipAddress/EMail"/>
   </xsl:template>
</xsl:stylesheet>

但是描述字段没有更新。请告诉我这是什么问题。

1 个答案:

答案 0 :(得分:0)

找到问题的解决方案是件好事,但你的结论是错误的。

  

在xslt中,为了获得祖母,我们应该使用../../../*

不是真的。关键是你实际上正在寻找Description文本内容的盛大父母,即OrderOrders/Order/OrderData/Description/text()的祖父是OrderData。但OrderData小时候没有元素EMail - 这就是你的方法失败的原因。

下面是一个稍微改进的样式表。它更直接地匹配Description并使用ancestor::轴而不是一系列..

<强>样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

   <xsl:template match="Description/text()">
     <xsl:value-of select="ancestor::Order/ShipAddress/EMail"/>
   </xsl:template>

</xsl:stylesheet>

XML输入

<Orders>
    <Order>
       <ShipAddress>
          <EMail>a@b.com</EMail>
       </ShipAddress>

       <OrderData>
          <Description>xxxx</Description>
       </OrderData>
    </Order>
</Orders>

XML输出

<?xml version="1.0" encoding="utf-8"?>
<Orders>
   <Order>
      <ShipAddress>
         <EMail>a@b.com</EMail>
      </ShipAddress>
      <OrderData>
         <Description>a@b.com</Description>
      </OrderData>
   </Order>
</Orders>