我想创建一个通用的 XSLT 2.0 函数,它可以像这样在 xml 上运行:
<?xml version="1.0"?>
<foo xmlns:my="http://meohmy.org" xmlns:yours="http://meohmy2.org">
<yours:pet my:type="dog" my:color="red">Cindy</yours:pet>
<yours:pet my:type="cat">Felix</yours:pet>
<yours:pet my:type="cat" my:color="green">Pai Mei</yours:pet>
</foo>
并给出这样的函数签名:
my:doit('item',/foo/yours:/pet,@my:color)
(第一个参数是标签,第二个是我要报告的节点集,第三个是我想为第二个参数的节点集中的每个节点输出的值,无论它是否有)。
我希望它返回这样的数据:
info=red;;green
请注意,我想要一个与没有第三个参数的元素对应的空占位符,并且顺序很重要。
由于我在样式表中经常这样做(出于不同原因数十次),因此函数似乎是一种自然的方式。这是我到目前为止想出的...
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="http://meohmy.org"
xmlns:yours="http://meohmy2.org">
<xsl:template match="/">
<xsl:value-of select="my:doit('item',/foo/yours:pet,@my:color)"/>
</xsl:template>
<xsl:function name="my:doit" as="xs:string?">
<xsl:param name="item" as="xs:string"/>
<xsl:param name="value"/>
<xsl:param name="subvalue"/>
<xsl:if test="$value">
<xsl:value-of>
<xsl:value-of select="$item"/>
<xsl:text>=</xsl:text>
<xsl:for-each select="$value">
<xsl:value-of select="current()/$subvalue"/>
<xsl:if test="position() != last()">
<xsl:text>;</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:value-of>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
但是,当我这样做时,我从函数 doit() 中得到以下值:
item=;;
这向我表明<xsl:value-of select="current()/$subvalue"/>
样式表中的 不正确。我很接近,我能感觉到;> 有什么建议吗?
谢谢!