需要了解XSLT方法和TAGS的功能

时间:2015-12-11 14:59:17

标签: xml xslt xml-parsing transform

我尝试使用XSLT转换XML时添加名称空间前缀。起初我在xml文件中尝试<app:ABC>并且获得与不绑定相关的异常(忘记它不确定异常)然后我遵循了这个link但我和#39;在理解这个问题时遇到了一些麻烦。我有以下问题如下:

  1. <xsl:copy> - 它用于什么?根据我的理解,这用于复制元素。它只复制根元素还是后续子元素?
  2. <xsl:apply-templates select="node()|@*"> - 我不确定这个过程是如何工作的,我该如何使用select属性? node()它用于什么?也是@*标志。我假设|符号用于OR。如果没有,请指导我。
  3. <xsl:element name="app:{name()}" namespace="http://my.ns.uri"> - 根据我的理解,元素标记用于在XML中添加节点(元素)。在这里,我再次与name()方法混淆。它用于什么?我们可以只使用元素名称而不是它吗?并且命名空间属性是否必要?请确认。
  4. <xsl:copy-of select="namespace::*"/>不知道这件事。请指导我为什么只是使用这个或必要的。
  5. 欢迎所有意见和建议。

    由于

1 个答案:

答案 0 :(得分:0)

您引用的解决方案是经过修改的identity transformation,它匹配XML节点并将模板应用于文档中的每个属性和节点,并将它们复制到输出中。

除非有更具体的模板可用,否则身份模板将匹配,复制上下文节点,然后将模板应用于匹配项的任何属性或子节点()。

  1. <xsl:copy>
  2.   

    xsl:copy元素提供了一种复制当前节点的简便方法。   实例化xsl:copy元素会创建当前节点的副本。   当前节点的命名空间节点将自动复制为   好吧,但节点的属性和子节点不是   自动复制。 xsl:copy元素的内容是a   创建节点的属性和子节点的模板;该   内容仅针对可以具有的类型的节点进行实例化   属性或子节点(即根节点和元素节点)。

    1. <xsl:apply-templates select="@*|node()"/> - 从上下文节点中选择任何属性或子节点并应用模板,从样式表中定义的模板中查找最具体的匹配项。

      • |是一个联盟运营商。它有点像OR,有点像AND,取决于你如何看待它。如果操作员的左侧或右侧有重复的节点,则结果将是删除了重复项的唯一项目列表。
      • @*将选择附加到上下文节点的任何属性
      • node()将选择作为context元素的子元素的任何元素,文本节点,处理指令或注释。等效表达式为*|text()|processing-instruction()|comment()
    2. <xsl:element name="app:{name()}" namespace="http://my.ns.uri">

    3.   

      xsl:element元素允许使用a创建元素   计算名称。要创建的元素的扩展名称是   由必需的name属性和可选的命名空间指定   属性。 xsl:element元素的内容是一个模板   已创建元素的属性和子元素。

           

      name属性被解释为属性值模板。它   如果实例化的字符串是一个错误   属性值模板不是QName。 XSLT处理器可能会发出信号   错误;如果它没有发出错误信号,那么它必须通过恢复   使实例化xsl:element元素的结果成为   通过实例化内容创建的节点序列   xsl:element元素,不包括任何初始属性节点。如果   如果不存在namespace属性,则QName将扩展为   扩展名使用有效的命名空间声明   xsl:element元素,包括任何默认的名称空间声明。

           

      如果存在namespace属性,则它也被解释为   属性值模板。由此产生的字符串   实例化属性值模板应该是URI引用。   如果字符串不是语法上合法的URI,则不是错误   参考。如果字符串为空,则表示扩展名   element具有空名称空间URI。否则,该字符串用作   要创建的元素的扩展名称的名称空间URI。该   name属性指定的QName的本地部分用作   

      。要创建的元素的扩展名的本地部分
      • name()用于获取上下文节点的名称(正在转换的节点)。它的基本名称&#34;与命名空间前缀连接,命名空间前缀将绑定到@namespace属性中声明的命名空间。模板可以(也可能应该)使用local-name(),这将是&#34; base&#34;没有名称空间前缀的元素的名称。由于转换的源文档没有任何名称空间前缀,name()local-name()将返回相同的值。
      • 对于几乎所有的XSLT处理器(我都没有遇到过这样的处理方式),如果在XSLT中声明了名称空间,并且在元素名称构造函数中使用了它的名称空间前缀,那么#39; t必须使用@namespace属性显式声明名称空间。 XSLT处理器将元素绑定到与styleshet中声明的namespace-prefix匹配的命名空间。
        

      XSLT处理器可以使用指定的QName的前缀   选择用于输出的前缀时的name属性   创建元素为XML;但是,他们不需要这样做。

      1. <xsl:copy-of selecct="namespace::*"/> - 这显式复制了上下文节点上的所有命名空间节点。通常没有必要。