XSLT-1.0 можно ли использовать переменную для доступа к другим узлам? - PullRequest
0 голосов
/ 19 декабря 2011

С таким простым XML-кодом, как этот

<value>
    <num>
        <accession>111</accession>
        <sequence>AAA</sequence>
        <score>4000</score>
    </num>
</value>

Я хочу знать, возможно ли получить доступ к определенному узлу с узла, ранее сохраненного в переменной. Код XSLT очень короткий и лучше объясняет, что я хочу сказать

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/value/num">
        <xsl:variable name="node">
            <xsl:copy-of select="current()"/>
        </xsl:variable>
        <root>
          <xsl:copy-of select="$node"/>
        </root>
    </xsl:template>
</xsl:stylesheet>

Итак, я храню узел в переменной «узел». Затем я могу напечатать содержимое узла с помощью $node.

(РЕДАКТИРОВАТЬ) XML вывод

<root>
    <num>
        <accession>111</accession>
        <sequence>AAA</sequence>
        <score>4000</score>
    </num>
</root>

Что я хочу сделать, это напечатать содержимое подузла, как это

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/value/num">
        <xsl:variable name="node">
            <xsl:copy-of select="current()"/>
        </xsl:variable>
        <root>
          <xsl:copy-of select="$node/accession"/>
        </root>
    </xsl:template>
</xsl:stylesheet>

Но выдает ошибку (Компонент вернул код ошибки: 0x80600008 [nsIXSLTProcessor.transformToFragment]) (отметьте здесь )

(РЕДАКТИРОВАТЬ) XML, который я хотел бы, это

<root>
    <accession>111</accession>
</root>

ПРИМЕЧАНИЕ. Вопрос не в том, как я могу получить этот вывод. Вопрос в том, как, используя переменную, как в предоставленном XSLT, я могу получить этот вывод.

(РЕДАКТИРОВАТЬ: решаемые) На самом деле это возможно, но, как указано в комментариях, значение переменной должно быть присвоено с атрибутом «select», если требуется набор узлов. Таким образом, этот код не работал, так как в переменной был сохранен фрагмент дерева вместо набора узлов (подробнее см. здесь )

Спасибо!

1 Ответ

1 голос
/ 19 декабря 2011

Попробуйте это:

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:template match="/value">
        <root>
            <xsl:for-each select="num">
                <xsl:variable name="node" select="current()" />
                <xsl:copy-of select="$node/accession" />
           </xsl:for-each>
        </root>
    </xsl:template>
</xsl:transform>

Обратите внимание, что я использовал xsl: transform вместо xsl: stylesheet. Кроме того, рассмотрите возможность использования версии 2.0 вместо 1.0, если у вас совместимый процессор, он добавляет много полезных функций.

Я все еще не вижу вашей потребности в переменной.

...