大家好我试图转换这个xml:
<element>
<element>
<element>
</element>
</element>
<element>
</element>
</element>
对此:
<element test="">
<element test="f">
<element test="ff">
</element>
</element>
<element test="f">
</element>
</element>
所以无论父/ @测试与'#34; f&#34;等等。
我目前有这个xml:
<xsl:template match="@*|node()" mode="copying">
<xsl:copy>
<xsl:apply-templates select="@*|node()" mode="copying"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::newline or self::tab or self::space)]" mode="copying">
<xsl:copy>
<xsl:apply-templates select="@*" mode="copying"/>
<xsl:attribute name="test">
<xsl:choose>
<xsl:when test="parent::*">
<xsl:value-of select="concat(../@test,' ')"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="''"/>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:apply-templates select="node()" mode="copying"/>
</xsl:copy>
</xsl:template>
但它只是忽略了父属性的值。有人可以帮帮我吗?
答案 0 :(得分:0)
使用XSLT 2.0,您可以使用
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::newline or self::tab or self::space)]">
<xsl:param name="test" tunnel="yes" select="''"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="test" select="$test"/>
<xsl:apply-templates select="node()">
<xsl:with-param name="test" tunnel="yes" select="concat($test, 'f')"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:transform>
使用XSLT 1.0,您需要确保身份转换模板(第一个模板)以及您可能已传递参数的所有其他模板:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@*|node()">
<xsl:param name="test"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:with-param name="test" select="concat($test, 'f')"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(self::newline or self::tab or self::space)]">
<xsl:param name="test" select="''"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:attribute name="test">
<xsl:value-of select="$test"/>
</xsl:attribute>
<xsl:apply-templates select="node()">
<xsl:with-param name="test" select="concat($test, 'f')"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
</xsl:transform>