用XSLT替换一节

时间:2014-03-12 10:55:24

标签: xml xslt

我正在尝试使用XSLT替换XML中的一个部分。

输入:

<data>
    <entry>
       <id>1</id>
       <propertyA>10</propertyA>
       <propertyB>20</propertyB>
    </entry>
    <entry>
       <id>2</id>
       <propertyA>8</propertyA>
       <propertyB>12</propertyB>
    </entry>
</data>

预期输出:

<data>
    <entry>
       <id>1</id>
       <propertyA>15</propertyA>
       <propertyB>8</propertyB>
    </entry>
    <entry>
       <id>2</id>
       <propertyA>8</propertyA>
       <propertyB>12</propertyB>
    </entry>
</data>

我打算使用XSLT复制所有节点来执行此操作,但跳过目标条目&amp;使用新值生成它们。

作为第一步,我写了一个XSLT来跳过目标条目。

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:apply-templates select="node()" />
  </xsl:copy>
</xsl:template>
<xsl:template match="/data/entry">
  <xsl:choose>
    <xsl:when test="id=$replaceId"></xsl:when>
    <xsl:otherwise>
      <xsl:apply-templates/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

但是当$ replaceId = 1时,我得到以下输出 - 缺少entry元素。我了解我的模板中匹配xsl:apply-templates的{​​{1}}导致此问题。但是,我不确定如何解决这个问题。在网上搜索一小时对我没有帮助。我相信,所以有些人可以帮助我。

entry

1 个答案:

答案 0 :(得分:1)

输出中缺少entry元素,因为您没有将其复制到输出中。另外,在&#34;何时&#34;条件得到满足:

<xsl:when test="id=$replaceId"></xsl:when>

entry元素的子节点根本不会被处理。

通常,最好是利用单独的模板而不是依赖xsl:choose。元素propertyApropertyB是您真正想要修改的元素 - 因此最好编写直接匹配它们的模板。

<强>样式表

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

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

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

    <xsl:variable name="replaceID" select="'2'"/>

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

   <xsl:template match="propertyA[parent::entry/id = $replaceID]">
        <xsl:copy>
            <xsl:value-of select="15"/>
        </xsl:copy>
   </xsl:template>

   <xsl:template match="propertyB[parent::entry/id = $replaceID]">
        <xsl:copy>
            <xsl:value-of select="8"/>
        </xsl:copy>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<data>
    <entry>
       <id>1</id>
       <propertyA>15</propertyA>
       <propertyB>8</propertyB>
    </entry>
    <entry>
       <id>2</id>
       <propertyA>8</propertyA>
       <propertyB>12</propertyB>
    </entry>
</data>