xml - 使用 XSLT <xsl :element> and declaring elements literally? 有什么区别

标签 xml xslt

我最近才开始使用 XSLT,想知道使用 <xsl:element> 之间的有效区别是什么用于定义元素与仅将它们声明为 XSLT 中的文字。例如,让我们来看一个简化的案例,我将一个小型 XML 文档的内容转换为 (x)HTML。

1.我可以选择 <xsl:element>方式:

<xsl:element name="h1">
    <xsl:value-of select="heading"/>
</xsl:element>

<强>2。或者手动定义元素:

<h1>
    <xsl:value-of select="heading"/>
</h1>

这两者之间的实际区别是什么?如果存在差异,哪些被认为是“好风格”

最佳答案

它们几乎相同,唯一的异常(exception)是文字 <h1>元素会将 样式表 中那个点范围内的 namespace 节点添加到结果树中,而 <xsl:element name="h1">惯于。这对您的输出有何不同取决于您的样式表包含哪些命名空间声明以及您在结果树中的何处使用它们(如果有的话)。例如,针对任何输入 XML 文档运行以下转换:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:foo="http://example.com">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/">
    <root>
      <foo:element1 />
      <foo:element2 />
    </root>
  </xsl:template>
</xsl:stylesheet>

产生以下输出(使用 xsltproc):

<?xml version="1.0"?>
<root xmlns:foo="http://example.com">
  <foo:element1/>
  <foo:element2/>
</root>

但改变字面量 <root>在样式表中为 <xsl:element name="root">而是产生

<?xml version="1.0"?>
<root>
  <foo:element1 xmlns:foo="http://example.com"/>
  <foo:element2 xmlns:foo="http://example.com"/>
</root>

作为<xsl:element> form 不会将“foo”命名空间节点附加到生成的元素。如果这很重要,并且您实际上想将样式表 namespace 声明复制到您使用 <xsl:element> 创建的元素上你可以通过嵌套类似的东西来做到这一点

<xsl:copy-of select="document('')/*/namespace::foo" />

直接在其中(使用 document('') 的习语,它提供对样式表 XML 文档本身的访问)。

但一般来说,主要使用<xsl:element>是在计算元素名称而不是“编译时”文字时。

关于xml - 使用 XSLT <xsl :element> and declaring elements literally? 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12568962/

相关文章:

xml - XSLT 对属性上的前同级求和

c# - 如何根据架构 (XSD) 验证 XML?出了点问题

xml - XSL : List divided into columns

mysql - XSLT - 删除最后一个逗号

xml - xslt 匹配筛选结果集的前 x 项

python - UnicodeEncodeError : 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128)

c# - LINQ:如何返回所有子元素?

c# - 使用 Web Api MVC 4 反序列化嵌套的 XML

xml - 如何复制 xml 元素

html - XSL字符转义问题