我遇到以下问题,请参阅代码示例:
<xsl:if test="/Document/test/id">
<TEST1>
<xsl:value-of select="/Document/test/id"/>
</TEST1>
</xsl:if>
我有一个巨大的 xslt 脚本,其中有很多相同的代码。我想创建一个函数,但总是出现错误。我问自己这是否是解决这个问题的正确解决方案。
为了使代码更好地可维护,我想使用如下所示的内容。 这不是 xslt 语法,因为我不知道如何使用,而是为了给出我正在寻找的内容的想法。
...
<xsl:something "TEST1", "/Document/test/id1" />
<xsl:something "TEST2", "/Document/test/id2" />
...
代码会更好的可读性和可维护性,尽管我不知道如何解决这个问题:-( 欢迎任何建议...
问候德克
最佳答案
这种转变:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="/">
<xsl:sequence select="my:test(xs:QName('Test1'), /*/test/id1/string())"/>
<xsl:sequence select="my:test(xs:QName('Test2'), /*/test/id2/string())"/>
<xsl:sequence select="my:test(xs:QName('Test3'), /*/test/id3/string())"/>
<xsl:sequence select="my:test(xs:QName('Test4'), /*/test/id4/string())"/>
</xsl:template>
<xsl:function name="my:test">
<xsl:param name="pName" as="xs:QName"/>
<xsl:param name="pToPresent" as="item()?"/>
<xsl:if test="$pToPresent">
<xsl:element name="{$pName}">
<xsl:sequence select="$pToPresent"/>
</xsl:element>
</xsl:if>
</xsl:function>
</xsl:stylesheet>
当应用于以下 XML 文档时:
<Document>
<test>
<id1>Some Id1</id1>
</test>
<test>
<id2>Some Id2</id2>
</test>
<test>
<id4>Some Id4</id4>
</test>
</Document>
产生了想要的正确结果:
<Test1>Some Id1</Test1>
<Test2>Some Id2</Test2>
<Test4>Some Id4</Test4>
请注意:
my:test()
的第一个参数声明为xs:QName
类型,这保证了name
的值xsl:element
指令的 code> 属性始终是有效名称。my:test()
的第二个参数被声明为非常宽松的item()?
类型,这使我们可以自由地提供任何类型的项目(字符串或节点或元素,或...),并且所提供的内容将“按原样”再现。
关于xslt - 创造什么?函数或模板还是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176059/