我有一個定義了幾個函數的XSL。Java/Saxon:以編程方式運行XSL函數
我想編寫Java代碼,取名字的XSL函數(參數列表)的並運行該功能(和,當然,綁定函數的自變量的形式參數)。
到目前爲止,我所擁有的唯一的解決辦法是產生,在飛行中,與運行所選擇的功能的主模板XSL代碼。這很尷尬。我正在尋找一種解決方案,讓我通過Saxon API直接運行一個函數。
我有一個定義了幾個函數的XSL。Java/Saxon:以編程方式運行XSL函數
我想編寫Java代碼,取名字的XSL函數(參數列表)的並運行該功能(和,當然,綁定函數的自變量的形式參數)。
到目前爲止,我所擁有的唯一的解決辦法是產生,在飛行中,與運行所選擇的功能的主模板XSL代碼。這很尷尬。我正在尋找一種解決方案,讓我通過Saxon API直接運行一個函數。
XPath Visualizer執行此操作(無論使用的是XSLT處理器)的方式是將主XSL樣式表作爲XML文檔加載,並使用必要的XPath表達式動態修改一個select
屬性。
像這樣:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="yourTrueMainStylesheetModule"/>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vResult" select="."/>
<xsl:template match="/">
<xsl:sequence select="$vResult"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
負載上述樣式表模塊作爲一個如下。
問題:SelectNodes("/*/xsl:variable[@name='vResult']/@select")
使用您的DOM API修改選定屬性所需的一個值,說:my:foo(1,2,3)
。
啓動使用已經加載的(和動態地修改樣式錶轉換
我已被使用多年我的XPath的可視化工具2(用於XSLT 2.0 - 未發表)作爲命令行 - 樣。口譯FXSL功能,我可以自由地寫:
f:fold(f:mult(), 1, 1 to 4)
,並得到顯示正確的結果:
24
這裏是使用XPath展示臺2作爲FXSL解釋的屏幕截圖:
你可能無法直接,但不能你只要有呼籲根據您的參數之一不同的模板,就像一個大的switch語句中的主模板。
有做這個XQuery的(XQueryEvaluator.callFunction()在s9api包)的API,但沒有可比性XSLT。通過調用低級內部方法的正確序列可能實現它,但您可能必須研究源代碼才能使其運行。
XSLT已經具有根據輸入文檔的內容運行不同指令的功能:模板。我相信,如果您已經在運行XSLT,那麼撒克遜的內部API太麻煩了,只需編譯一次這個大的XSLT並重新使用它即可。
只是花時間去了解XSLT和它的功能性質和轉換的功能,模板和右match
表達。
我舉個例子。假設我們有兩個輸入XML:
<myxml>
<doctype>recipe</doctype>
<descr>Bread 'n jam sandwich</descr>
<var>jam</var>
<var>bread</var>
</myxml>
<myxml>
<doctype>shoppinglist</doctype>
<descr>Monday</descr>
<var>honey</var>
<var>butter</var>
<var>loaf of bread</var>
<var>jam</var>
</myxml>
現在讓我們假設我們要爲這些XML格式生成正確格式的HTML。第一個XML應該生成一個帶有「Recipe:」和一系列成分的HTML。第二個應該包含一個購物清單。
下面就來同時生成XSLT:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:saxon="http://saxon.sf.net/"
exclude-result-prefixes="xs saxon">
<xsl:output method="html" indent="yes"/>
<!-- Generate basic html -->
<xsl:template match="/">
<html>
<body><xsl:apply-templates /></body>
</html>
</xsl:template>
<!-- Only call template doctype element, not for vars -->
<xsl:template match="myxml">
<xsl:apply-templates select="doctype"/>
</xsl:template>
<xsl:template match="doctype[.='shoppinglist']">
<h1>Shopping list for <xsl:value-of select="../descr"/></h1>
<span><b>Stuff to bring:</b></span>
<ul>
<xsl:for-each select="../var">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
<xsl:template match="doctype[.='recipe']">
<h1>Recipe: <xsl:value-of select="../descr"/></h1>
<span><b>Ingredients:</b></span>
<ul>
<xsl:for-each select="../var">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
現在看的最後一個模板的match
說法。在這種情況下,我根據元素的內容進行挑選,但您可以使用任何您喜歡的XPath篩選器表達式(即根據XML參數進行選擇)。