我正在尝试使用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
答案 0 :(得分:1)
输出中缺少entry
元素,因为您没有将其复制到输出中。另外,在&#34;何时&#34;条件得到满足:
<xsl:when test="id=$replaceId"></xsl:when>
此entry
元素的子节点根本不会被处理。
通常,最好是利用单独的模板而不是依赖xsl:choose
。元素propertyA
和propertyB
是您真正想要修改的元素 - 因此最好编写直接匹配它们的模板。
<强>样式表强>
<?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>