如果我有一个带
的xml<?xml version="1.0" encoding="utf-8" ?>
<Rowsets>
<Rowset>
<Row>
<Name>Derek</Name>
<City>Seattle</City>
</Row>
<Row>
<Name>Bob</Name>
</Row>
</Rowset>
</Rowsets>
和xsl as:
<xsl:param name="Criteria1" />
<xsl:param name="Cirteria1AddBeforeText" />
<xsl:template match="/">
<Rowsets>
<xsl:if test="count(/Rowsets/FatalError) = '0'">
<xsl:for-each select="/Rowsets/Rowset">
<Rowset>
<xsl:for-each select="Row">
<xsl:copy-of select="." />
</xsl:for-each>
</Rowset>
</xsl:for-each>
</xsl:if>
</Rowsets>
</xsl:template>
如何更改xsl以便:
<xsl:copy-of select="."/>
部分xsl被替换为代码,该代码检查节点名称是否与参数F1相同,以便我可以输出对Criteria1 = City,Cirteria1AddBeforeText =&#34;城市:&#34; < / p>
<?xml version="1.0" encoding="utf-8" ?>
<Rowsets>
<Rowset>
<Row>
<Name>Derek</Name>
<City>City : Seattle</City>
</Row>
<Row>
<Name>Bob</Name>
</Row>
</Rowset>
</Rowsets>
我真正想要的是了解如何修改for-each语句的当前节点集,以便根据输入参数更改特定元素,如果未找到条件,则保留所有其他行
答案 0 :(得分:0)
您不需要更改输入节点,您需要做的是使用模板而不是copy-of
来创建适当的修改节点。我开始使用&#34;身份转换&#34;来解决这个问题。然后为Row
的子元素添加一个特殊情况:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="Criteria1" />
<xsl:param name="Cirteria1AddBeforeText" />
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>
</xsl:template>
<xsl:template match="Row/*">
<xsl:copy>
<xsl:if test="name() = $Criteria1">
<xsl:value-of select="$Cirteria1AddBeforeText" />
</xsl:if>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
对于&#34;致命错误&#34;逻辑你可以添加一个额外的模板
<xsl:template match="Rowsets[FatalError]">
<Rowsets>There was a fatal error</Rowsets>
</xsl:template>
(或者你想要的致命错误案例的逻辑)如果输入FatalError
下有任何Rowsets
元素,这将优先于身份模板。
答案 1 :(得分:0)
<xsl:for-each select="Row">
<xsl:copy-of select="." />
</xsl:for-each>
与以下内容相同:
<xsl:copy-of select="Row" />
同样地:
<xsl:for-each select="/Rowsets/Rowset">
<Rowset>
<xsl:for-each select="Row">
<xsl:copy-of select="." />
</xsl:for-each>
</Rowset>
</xsl:for-each>
可以简单地表达为:
<xsl:copy-of select="Rowsets/Rowset" />