0

有没有办法以类似于自定义函数的方式创建扩展 XSLT 的自定义标记?

即(在我的 xslt 文件中):

<xsl:template match="/">
<div>
  <my:customTag items="3" classname="foo"/>
</div>
</xsl:template>

预期输出:

<div>
  <ul class="foo">
    <li>...</li>
    <li>...</li>
    <li>...</li>
  </ul>
<div>

目前我正在这样做:

<xsl:template match="/">
<div>
  <xsl:copy-of select="my:customFunc(3,'foo')" />
</div>
</xsl:template>

我在 vb 代码中的 customFunc 做这样的事情:

Public Function customFunc(ByVal n As Integer, ByVal classname as String) As System.Xml.XmlNode
            Dim newNode As System.Xml.XmlNode
            Dim doc As System.Xml.XmlDocument = New System.Xml.XmlDocument()
            Dim xmlContent As String = "<ul class=""" + classname + """>"

            For v As Integer = 0 To n
                xmlContent += "<li>" + someComplicatedCalc(n) + "</li>"
            Next
            xmlContent += "</ul>"


            doc.LoadXml(xmlContent)
            newNode = doc.DocumentElement

            Return newNode
        End Function

但我想使用标签而不是函数。

4

3 回答 3

1

如果您正在寻找一种仅用 XSLT 替换 VB 函数的方法,您可以执行以下操作:

<xsl:template match="my:customTag">
    <ul class="{@classname}">
      <xsl:call-template name="expand_customTag">
        <xsl:with-param name="i" select="1" />
        <xsl:with-param name="count" select="@items" />
      </xsl:call-template>
    </ul>
</xsl:template>
<xsl:template name="expand_customTag">
    <xsl:param name="i" />
    <xsl:param name="count" />
    <il>....</il>
    <xsl:if test="$i &lt; $count">
      <xsl:call-template name="expand_customTag">
        <xsl:with-param name="i" select="$i + 1" />
        <xsl:with-param name="count" select="$count" />
      </xsl:call-template>
    </xsl:if>
</xsl:template>

这个想法是使用递归模板来生成您的<il>元素,这将使您的 XSLT 更容易移植到其他 XSLT 处理器。

于 2016-02-24T15:47:32.127 回答
1

如果您想使用现有的 VB.Net 代码但在源 XML 中有更好的语法,请尝试将此模板添加到您的样式表中。

<xsl:template match="my:customTag">
  <xsl:copy-of select="my:customFunc(@items,@classname)" />
</xsl:template>

xpath 选择器将使用您的<my:customTag items="3" classname="foo"/>

于 2016-02-24T16:02:45.347 回答
1

我不知道微软和其他处理器(如 XmlPrime 或 Saxon(http://saxonica.com/html/documentation9.6/extensibility/instructions.html ))对这个称为自定义扩展元素的功能的任何支持似乎不用.NET支持它。XslCompiledTransform

于 2016-02-24T15:28:24.900 回答