Ничего не возвращено для имени элемента (XSL / XPath) - PullRequest
1 голос
/ 03 августа 2010

У меня есть код, который я ожидаю вернуть имя элемента, но ничего не возвращается.

Следующий код взят из XSL-документа, который генерирует другой XSL-документ.выражение XPath.

<xsl:template match="/">
    ...
    <xslt:template match="{$expression}">
        <elem key="{name()}">
            <xslt:copy-of select="@*"/>
            <xslt:for-each select="@*">
                <xslt:sort select="name()"/>
                <attribute>|<xslt:value-of select="name()"/>|</attribute>
            </xslt:for-each>
        </elem>
    </xslt:template>
    ...
</xsl:template>

Этот код генерирует второй документ XSL с этим кодом ... обратите внимание, что @key пуст.

<xsl:template match="//*[@name='Spot']">
    <elem key="">
        <xsl:copy-of select="@*" />
        <xsl:for-each select="@*">
            <xsl:sort select="name()" />
            <attribute>|<xsl:value-of select="name()" />|</attribute>
        </xsl:for-each>
    </elem>
</xsl:template>

Кроме того, что @key пуст,работает как положено.Моя единственная проблема - отображение имени элемента.

РЕДАКТИРОВАТЬ: Чтобы уточнить, что я на самом деле ищу, мне нужны имена элементов из результатов, возвращаемых <xslt:template match="{$expression}">.

Спасибо!:)

Ответы [ 2 ]

1 голос
/ 04 августа 2010

Поскольку ваше преобразование производит сам код XSLT, и вы хотите получить в результате:

<elem key="{name()}">

вы должны экранировать { и }, чтобы AVT не оценивался сразу.

Создание { и } как есть выполняется путем удвоения их, как указано в спецификации XSLT :

"Когда шаблон значения атрибута экземпляр, двойной слева или справа фигурная скобка вне выражения воли быть заменены одной фигурной скобкой. «

Поэтому замените :

<xslt:template match="{$expression}">   
    <elem key="{name()}">   
        <xslt:copy-of select="@*"/>   
        <xslt:for-each select="@*">   
            <xslt:sort select="name()"/>   
            <attribute>|<xslt:value-of select="name()"/>|</attribute>   
        </xslt:for-each>   
    </elem>   
</xslt:template> 

с:

<xslt:template match="{$expression}">   
    <elem key="{{name()}}">   
        <xslt:copy-of select="@*"/>   
        <xslt:for-each select="@*">   
            <xslt:sort select="name()"/>   
            <attribute>|<xslt:value-of select="name()"/>|</attribute>   
        </xslt:for-each>   
    </elem>   
</xslt:template> 

и в результате вы получите:

<xsl:template match="//*[@name='Spot']">       
    <elem key="{name()}">       
        <xsl:copy-of select="@*" />       
        <xsl:for-each select="@*">       
            <xsl:sort select="name()" />       
            <attribute>|<xsl:value-of select="name()" />|</attribute>       
        </xsl:for-each>       
    </elem>       
</xsl:template> 

Примечание : Я удивлен, что этот код работает вообще. Вы должны использовать инструкцию <xsl:namespace-alias> XSLT.

0 голосов
/ 04 августа 2010

/ возвращает узел, содержащий корневой узел документа XML, а не сам корневой узел.У этого узла нет имени.

Я полагаю, вы хотите указать имя ребенка этого узла.Вы можете сделать это несколькими способами.Во-первых, вы можете изменить <xsl:template match="/"> на <xsl:template match="/root"> (где root - любое имя корневого узла) или вы можете изменить <elem key="{name()}"> на <elem key="{name(root)}">.

.имя заранее.Если это так, вы можете использовать <xsl:template match="/*">.Это вернет всех потомков родителя корня.В этом случае всегда есть только один корень.Тогда вы можете использовать <elem key="{name()}"> как обычно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...