我有一个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>
请帮忙。提前谢谢。
答案 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>