функция документа в xslt - PullRequest
1 голос
/ 04 февраля 2011

Я запускаю преобразование с использованием кода .NET4.

преобразование работает просто отлично, когда я пишу xpath с функцией документа непосредственно в xslt (см. Элемент PanelOK в примере xslt):

но когда сам xPath хранится в переменной, он не будет работать (см. Элемент PanelException):

<xsl:value-of select="@Customer"/>

где @Customer имеет значение "document ('myXml.xml') / COM: root / COM: Global / @ Customer"

Затем я расширил свой xslt скриптом. Это прекрасно работает, когда я не использую функцию документа в xpath, например только / COM: root / COM: Global / @ Customer. Но с функцией документа я получаю исключение XsltContext необходим для этого запроса из-за неизвестной функции.

Вот примеры: xml1 имеет атрибут customer со значением, содержащим выражение xpath, xml2 - файл, в котором можно найти это значение, xslt - преобразование, которое преобразует xml1 и оценивает выражение xpath, сохраненное в атрибуте customer, который следует поискать значение в xml2 с помощью пользовательского сценария, в котором происходит исключение, а затем в операторе выбора. Что я должен сделать, чтобы это работало?

xml1:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<SFK:root xmlns:SFK="http://www.Test.com/SoftKeys">
  <SFK:Panel Customer="document('setting.xml')/COM:root/COM:Global/@Customer">
  </SFK:Panel>
</SFK:root>

xml2:

<?xml version="1.0" encoding="UTF-16" standalone="no"?>
<COM:root xmlns:COM="http://www.Test.com/Comm">
  <COM:Global Customer="Microsoft">
  </COM:Global>
</COM:root>

XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:dyn="http://exslt.org/dynamic"
                xmlns:SFK="http://www.Test.com/SoftKeys"
                xmlns:COM="http://www.Test.com/Comm"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                extension-element-prefixes="dyn msxsl"
                exclude-result-prefixes="msxsl xsl SFK COM dyn">

    <!--Script to evaluate a string xPath to a Node. the real evaluate extension is not implemented in MS xslt processor-->
    <msxsl:script implements-prefix="dyn" language="C#">
        <![CDATA[
            public XPathNodeIterator evaluate(XPathNavigator context, string expression)
            {
                XmlNamespaceManager mngr = new XmlNamespaceManager(new NameTable());
                mngr.AddNamespace("SFK","http://www.Test.com/SoftKeys");
                mngr.AddNamespace("COM","http://www.Test.com/Comm");
                mngr.AddNamespace("msxsl","urn:schemas-microsoft-com:xslt");

                return context.Select(expression,mngr); // here occurs the exception
            }
        ]]>
    </msxsl:script>

    <xsl:output method="xml" version="1.0"  encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
         <xsl:apply-templates select="current()/SFK:root/SFK:Panel"/>
    </xsl:template>
    <xsl:template match="SFK:Panel">
        </PanelOk>
            <xsl:value-of select="document('xml2.xml')/COM:root/COM:Global/@Customer"/>
         </PanelOk>
         </PanelException>
            <xsl:value-of select="dyn:evaluate(., @Customer)"/>
         </PanelException>     
    </xsl:template>
</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 04 февраля 2011

Функция EXSLT dyn:evaluate не реализована в процессорах Microsoft XSLT .

Это можно обойти, если разные части желаемого выражения XPath кодируются в отдельных элементах / атрибутахxml1.

Конечно, это очень ограниченное решение, требующее соглашений и дисциплины.

Динамическая оценка выражений XPath не поддерживается даже в XSLT 2.0 / XPath2.0 .Такая поддержка может быть доступна в более поздних версиях, но версии 3.0 по-прежнему имеют статус «рабочий черновик».

1 голос
/ 04 февраля 2011

Боюсь, что функция document не определена в спецификации XPath и поэтому недоступна в реализации XPath 1.0, такой как Microsoft XPathNavigator.Функция document определена только в XSLT.

Я не уверен, что предложить, с Saxon 9 или с XQSharp вы могли бы вместо этого использовать функцию XPath 2.0 doc, но я не уверен, что вы хотитеперейти от встроенной реализации XSLT и XPath 1.0 .NET Framework к сторонней реализации XSLT и XPath 2.0.

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