使用XSLT替换具有一些内部文本的节点的兄弟的内部文本

时间:2015-05-05 13:03:50

标签: xml xslt xslt-1.0

我有一个xml,我正在尝试找到一个内部文本为123的节点,然后找到它的后续或预先绑定的兄弟duration,然后替换它的值。

XML

<?xml version="1.0" encoding="utf-8" ?>
<classes>
<class>
  <id>123</id>
  <duration>100</duration>
  <price>price</price>
</class>
<class>
  <id>234</id>
  <duration>10</duration>
  <price>100</price>
</class>
<class>
  <id>123</id>
  <duration>120</duration>
  <price>price</price>
</class>
</classes>

XSLT :          

<xsl:template match="id[text()='123']">
    <xsl:copy>
        <xsl:if test="count(following-sibling::duration) or count(preceding-sibling::duration)">
            <xsl:text>abc</xsl:text>
        </xsl:if>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

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

输出

<?xml version="1.0" encoding="utf-8" ?>
<classes>
<class>
  <id>123</id>
  <duration>newValue</duration>
  <price>price</price>
</class>
<class>
  <id>234</id>
  <duration>10</duration>
  <price>100</price>
</class>
<class>
  <id>123</id>
  <duration>newValue</duration>
  <price>price</price>
</class>
</classes>

请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:2)

尝试:

<xsl:template match="class[id='123']/duration">
    <xsl:copy>
        <xsl:text>abc</xsl:text>
    </xsl:copy>
</xsl:template>

或:

<xsl:template match="duration[../id='123']">
    <xsl:copy>
        <xsl:text>abc</xsl:text>
    </xsl:copy>
</xsl:template>

而不是:

<xsl:template match="id[text()='123']">
    <xsl:copy>
        <xsl:if test="count(following-sibling::duration) or count(preceding-sibling::duration)">
            <xsl:text>abc</xsl:text>
        </xsl:if>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

答案 1 :(得分:1)

匹配duration而不是id

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

  <xsl:template match="duration[   preceding-sibling::id = '123' 
                                or following-sibling::id = '123']">
    <xsl:copy>newValue</xsl:copy>
  </xsl:template>

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

然后您的输入:

<?xml version="1.0" encoding="utf-8" ?>
<classes>
  <class>
    <id>123</id>
    <duration>100</duration>
    <price>price</price>
  </class>
  <class>
    <id>234</id>
    <duration>10</duration>
    <price>100</price>
  </class>
  <class>
    <id>123</id>
    <duration>120</duration>
    <price>price</price>
  </class>
</classes>

将转换为您请求的输出:

<?xml version="1.0" encoding="UTF-8"?>
<classes>
  <class>
      <id>123</id>
      <duration>newValue</duration>
      <price>price</price>
  </class>
  <class>
      <id>234</id>
      <duration>10</duration>
      <price>100</price>
  </class>
  <class>
      <id>123</id>
      <duration>newValue</duration>
      <price>price</price>
  </class>
</classes>