Я запускаю преобразование с использованием кода .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>