以下工作:XSLT:XSL:功能不會爲我工作
<xsl:variable name="core" select="document('CoreMain_v1.4.0.xsd')" />
<xsl:variable name="AcRec" select="document('AcademicRecord_v1.3.0.xsd')" />
<xsl:template match="xs:element">
<xsl:variable name="prefix" select="substring-before(@type, ':')" />
<xsl:variable name="name" select="substring-after(@type, ':')" />
<xsl:choose>
<xsl:when test="$prefix = 'AcRec'">
<xsl:apply-templates select="$AcRec//*[@name=$name]">
<xsl:with-param name="prefix" select="$prefix" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$prefix = 'core'">
<xsl:apply-templates select="$core//*[@name=$name]">
<xsl:with-param name="prefix" select="$prefix" />
</xsl:apply-templates>
</xsl:when>
</xsl:choose>
</xsl:template>
但是我用同樣的邏輯來處理基於前綴的電流或其他文檔元素的查找,匹配節點名稱在樣式表中的許多地方。因此,改變樣式表的版本到2.0後,我想:
<xsl:template match="xs:element">
<xsl:value-of select="my:lookup(@type)" />
</xsl:template>
<xsl:function name="my:lookup">
<xsl:param name="attribute" />
<!-- parse the attribute for the prefix & name values -->
<xsl:variable name="prefix" select="substring-before($attribute, ':')" />
<xsl:variable name="name" select="substring-after($attribute, ':')" />
<!-- Switch statement based on the prefix value -->
<xsl:choose>
<xsl:when test="$prefix = 'AcRec'">
<xsl:apply-templates select="$AcRec//*[@name=$name]">
<xsl:with-param name="prefix" select="$prefix" />
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$prefix = 'core'">
<xsl:apply-templates select="$core//*[@name=$name]">
<xsl:with-param name="prefix" select="$prefix" />
</xsl:apply-templates>
</xsl:when>
</xsl:choose>
</xsl:function>
在我的閱讀,我只發現返回文本的函數的例子 - 沒有呼模板。我有一個印象,一個xsl:函數應該總是返回文本/輸出...
經過更多的調查,它進入my:lookup函數和變量(前綴&名稱)正在填充。所以它會輸入xsl:choose語句,並且在測試時命中適當。問題似乎與apply-templates-value-of顯示的是子值有關; copy-of也一樣,我認爲這很奇怪(不應該輸出包含xml元素聲明?)。如果將模板聲明中的代碼移動到xsl:function,爲什麼會有區別?
哪個XSLT引擎?撒克遜或Xalan或其他什麼?請注意,Xalan不支持XSLT 2.0,但Saxon不支持。 Xalan和Saxon都支持函數,但它們在XSLT 1.0和2.0之間的行爲不同。 – lavinio 2009-07-14 18:43:33
我正在使用撒克遜。 – 2009-07-14 19:02:51