在XSLT中调用函数

时间:2016-01-14 16:00:26

标签: xml xslt xpath

我尝试运行其中一个在我自己的样式表中链接的函数。但我不知道如何。

这是 xsltransform.net demo

以下是我想要运行的功能:

func 1

func 2

1 个答案:

答案 0 :(得分:4)

假设像Saxon 9这样的XSLT 2.0处理器可以使用xsl:function,如下所示:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:func="http://example.com/mf">

    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <div>
            <ul>
                <xsl:apply-templates/>
            </ul>
        </div>
    </xsl:template>

    <xsl:template match="xs:element">
        <li xPath="{func:generateXPath(.)}">
            <xsl:value-of select="@name"/>
            <xsl:if test="xs:*">
                <ul>
                    <xsl:apply-templates/>
                </ul>
            </xsl:if>
        </li>
    </xsl:template>

    <xsl:function name="func:generateXPath" as="xs:string" >
        <xsl:param name="pNode" as="node()"/>
        <xsl:value-of select="$pNode/ancestor-or-self::*/name()" separator="/"/>

    </xsl:function>



</xsl:stylesheet>

使用像Saxon 6这样的XSLT 1.0处理器,我认为Xalan或XsltProc可以使用

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0"
  xmlns:func="http://exslt.org/functions"
  xmlns:mf="http://example.com/mf"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="func mf xs">

    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <div>
            <ul>
                <xsl:apply-templates/>
            </ul>
        </div>
    </xsl:template>

    <xsl:template match="xs:element">
        <li xPath="{mf:getXpath()}">
            <xsl:value-of select="@name"/>
            <xsl:if test="xs:*">
                <ul>
                    <xsl:apply-templates/>
                </ul>
            </xsl:if>
        </li>
    </xsl:template> 

<func:function name="mf:getXpath">
   <xsl:variable name="xpath">
      <xsl:for-each select="ancestor-or-self::*">
         <xsl:value-of select="name()"/>
         <xsl:if test="not(position()=last())">
            <xsl:value-of select="'/'"/>
         </xsl:if>
      </xsl:for-each>
   </xsl:variable>
   <func:result select="$xpath" />
</func:function>

</xsl:transform>