使用XSLT需要将变量值作为元素名称

22
我正在将一个XML格式转换为另一种格式,我需要插入一个元素并用变量的值命名它。例如,我正在使用XSLT尝试下面的语句,但是处理器返回一个错误,说元素名称无效。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml">

    <xsl:output method="xml" version="1.0" encoding="utf-8" indent="no" omit-xml-declaration="no"/>

    <xsl:variable name="i" select="i"/>
    <xsl:variable name="b" select="b"/>
    <xsl:variable name="u" select="u"/>
    <xsl:variable name="s" select="s"/>
    <xsl:variable name="r" select="r"/>
    <xsl:variable name="m" select="m"/>
    <xsl:variable name="n" select="n"/>

<xsl:template match="/|comment()|processing-instruction()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{local-name()}">
      <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

    <xsl:template match="//w:r">
        <xsl:if test="not(./descendant::w:i)">
         <xsl:variable name="i">0</xsl:variable>            
        </xsl:if>
        <xsl:if test="not(./descendant::w:b)">
         <xsl:variable name="b">0</xsl:variable>            
        </xsl:if>
        <xsl:if test="not(./descendant::w:u)">
         <xsl:variable name="u">0</xsl:variable>            
        </xsl:if>
        <xsl:if test="not(./descendant::w:caps)">
         <xsl:variable name="c">0</xsl:variable>            
        </xsl:if>

        <xsl:if test="not(contains($i,'0'))">
            <xsl:variable name="r" select="$i"></xsl:variable>
        <xsl:text>KARTHIKK</xsl:text>
        </xsl:if>
        <xsl:if test="not(contains($b,'0'))">
        <xsl:variable name="m" select="$r+$b"></xsl:variable>
        </xsl:if>
        <xsl:if test="not(contains($u,'0'))">
        <xsl:variable name="n" select="$m+$u"></xsl:variable>
        </xsl:if>
        <xsl:copy namespaces="no"><xsl:apply-templates/></xsl:copy>
<!--        <xsl:element name="{local-name(.)}"><xsl:element><xsl:value-of select="$n"/><xsl:apply-templates/></xsl:element></xsl:element>-->
    </xsl:template>


</xsl:stylesheet>

我该如何使用XSLT变量输出元素名称?


不清楚你想做什么,而且你的代码不符合XML语法。此外,不清楚在代码中你想构建一个元素,其名称是变量的值。请编辑和更正。 - Dimitre Novatchev
通常来说,任何示例(和问题)都不应超过15(20)行。虽然我们非常乐意帮助,但请不要强求解决方案。 - phihag
这对我来说不太清楚,主要是因为所有那些变量声明将在作用域中丢失。 - user357812
大家好,我还没有完成/验证代码。我只是想知道通过变量值生成元素名称的方法。如果存在一些元素集,则我的任务是生成一个新的包装器元素。根据子标签的可用性,元素名称将不同。例如,如果存在<i>和<b>标签,则需要生成<i_b>。如果存在<i>、<b>和<c>,则需要生成<i_b_c>。我认为这些信息会对你有所帮助... - Bhuvana
1个回答

67

通过变量的值来动态地定义元素名称是完全可以实现的:

<xsl:element name="{$vVar}">3</xsl:element>

如果变量 $vVar 的字符串值恰好是 "Hello",那么上面的代码将会输出:
<Hello>3</Hello>

然而,如果变量$vVar的字符串值恰好为"123",则会引发错误,因为字符串"123"在XML中不是合法名称。

不清楚您的代码中想要动态构建元素的位置(并且代码中还有其他错误),但只需使用上述规则/示例,您将完全按照所描述的方式构建元素。


3
这被称为AVT——属性-值模板。意思是花括号内的任何内容都必须被视为XPath表达式,然后对该表达式进行求值,将得到的值用作属性的值。 - Dimitre Novatchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接