XSL在当前节点内更改值

时间:2014-09-05 11:39:32

标签: xml xslt

如果我有一个带

的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语句的当前节点集,以便根据输入参数更改特定元素,如果未找到条件,则保留所有其他行

2 个答案:

答案 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" />