xslt - 创造什么?函数或模板还是?

标签 xslt xslt-2.0 xpath-2.0

我遇到以下问题,请参阅代码示例:

<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>

请注意:

  1. my:test() 的第一个参数声明为 xs:QName 类型,这保证了 name 的值xsl:element 指令的 code> 属性始终是有效名称。

  2. my:test() 的第二个参数被声明为非常宽松的 item()? 类型,这使我们可以自由地提供任何类型的项目(字符串或节点或元素,或...),并且所提供的内容将“按原样”再现。

关于xslt - 创造什么?函数或模板还是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176059/

相关文章:

xml - XSLT用于具有相同名称的多个元素

xml - XSLT - 通过使用正则表达式识别模式来替换文本节点

xml - 使用 XPath 是否可以以字符串形式获取目标节点路径中每个节点的名称?

java - XPath 中的循环?

xml - 将 HL7 段转换为 XML

xml - 如何使用 XSLT 制作 xml 节点子节点的精确副本?

xslt - 如何让 XSLT 在 Chrome 中工作?

XSL 文件的 javascript XML 处理不起作用

powershell - 安装了哪个版本的 XPath

c# - 转换过程中的 XSLT 问题