Требуется значение переменной в качестве имени элемента с использованием XSLT - PullRequest
20 голосов
/ 09 февраля 2011

Я конвертирую один формат 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?

1 Ответ

55 голосов
/ 09 февраля 2011

Вполне возможно построить элемент, имя которого определяется динамически значением переменной :

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

Если строковое значение переменной $vVar происходит сбудет "Hello", то приведенное выше выдает:

<Hello>3</Hello>

Однако, если строковое значение переменной $vVar окажется "123", возникает ошибка в виде строки "123" не является допустимым именем в XML .

Неясно, где в вашем коде вы хотите создать элемент динамически (и в коде есть другие ошибки), но простоиспользуйте приведенные выше правила / пример, и вы создадите элементы точно так, как описано.

...