【问题标题】:Need to know the functionality of the XSLT methods and TAGS需要了解 XSLT 方法和 TAGS 的功能
【发布时间】:2015-12-11 14:59:17
【问题描述】:
我正在尝试在使用 XSLT 转换 XML 时添加名称空间前缀。起初我在 xml 文件中尝试 <app:ABC> 并得到与 not bind 相关的异常(忘记它不确定异常)然后我遵循了这个 link 但我有一些在理解这一点时遇到麻烦。我有以下问题:
-
<xsl:copy> - 它有什么用。据我了解,这用于复制元素。它是只复制根元素还是复制下面的子元素?
-
<xsl:apply-templates select="node()|@*"> - 我不确定这个过程是如何工作的,我该如何使用 select 属性? node() 是干什么用的?还有@* 标志。我假设| 符号用于 OR。如果没有,请指导我。
-
<xsl:element name="app:{name()}" namespace="http://my.ns.uri"> - 据我了解 element 标签用于在 XML 中添加节点(元素)。在这里,我再次对name() 方法感到困惑。它是用来做什么的?我们可以只使用元素名称而不是它吗?并且命名空间属性是必要的吗?请确认。
-
<xsl:copy-of select="namespace::*"/> 不知道这个。请指导我为什么我们只是使用这个或必要的。
欢迎所有 cmets 和建议。
谢谢
【问题讨论】:
标签:
xml
xslt
xml-parsing
transform
【解决方案1】:
您引用的解决方案是修改后的identity transformation,它匹配 XML 节点并将模板应用到文档中的每个属性和节点,然后简单地将它们复制到输出。
除非有更具体的模板可用,否则身份模板将匹配,复制上下文节点,然后将模板应用于匹配项的任何属性或子节点()。
-
<xsl:copy>
xsl:copy 元素提供了一种复制当前节点的简单方法。
实例化xsl:copy 元素会创建当前节点的副本。
当前节点的命名空间节点自动复制为
好吧,但是节点的属性和子节点不是
自动复制。 xsl:copy 元素的内容是
创建节点的属性和子节点的模板;这
内容仅针对可以具有的类型的节点实例化
属性或子节点(即根节点和元素节点)。
-
<xsl:apply-templates select="@*|node()"/> - 从上下文节点中选择任何属性或子节点并应用模板,从样式表中定义的模板中寻找最具体的匹配。
-
| 是联合运算符。它的行为有点像 OR 和 AND,这取决于你如何看待它。如果运算符的左侧或右侧存在重复节点,则结果将是删除重复项的唯一项目列表。
-
@* 将选择附加到上下文节点的任何属性
-
node() 将选择作为上下文元素的子元素的任何元素、文本节点、处理指令或注释。等效表达式为 *|text()|processing-instruction()|comment()。
-
<xsl:element name="app:{name()}" namespace="http://my.ns.uri">
xsl:element 元素允许使用
计算名称。要创建的元素的扩展名称是
由必需的名称属性和可选的命名空间指定
属性。 xsl:element 元素的内容是一个模板
创建元素的属性和子元素。
name 属性被解释为属性值模板。它
如果实例化产生的字符串是错误的
属性值模板不是 QName。 XSLT 处理器可以发出信号
错误;如果它没有发出错误信号,那么它必须通过
使实例化 xsl:element 元素的结果成为
通过实例化的内容创建的节点序列
xsl:element 元素,不包括任何初始属性节点。如果
命名空间属性不存在,则 QName 扩展为
使用有效的命名空间声明的扩展名称
xsl:element 元素,包括任何默认命名空间声明。
如果命名空间属性存在,那么它也被解释为
属性值模板。产生的字符串
实例化属性值模板应该是一个 URI 引用。
如果字符串不是语法上合法的 URI,则不是错误
参考。如果字符串为空,则扩展名
元素有一个空命名空间 URI。否则,字符串被用作
要创建的元素的扩展名称的命名空间 URI。这
name 属性指定的 QName 的本地部分用作
要创建的元素的扩展名称的本地部分。
-
name() 用于获取上下文节点的名称(正在转换的节点)。它的“基本名称”与命名空间前缀相连,命名空间前缀将绑定到@namespace 属性中声明的命名空间。模板可以(并且可能应该)使用local-name(),这将是没有命名空间前缀的元素的“基本”名称。由于要转换的源文档没有任何命名空间前缀,name() 和 local-name() 将返回相同的值。
- 对于几乎每一个 XSLT 处理器(我还没有遇到一个不这样做的处理器),如果命名空间已在 XSLT 中声明并且您在元素名称构造函数中使用它的命名空间前缀,则不必使用
@namespace 属性显式声明命名空间。 XSLT 处理器会将元素绑定到与样式表中声明的名称空间前缀匹配的名称空间。
XSLT 处理器可以使用在
选择用于输出的前缀时的名称属性
创建为 XML 的元素;但是,他们不需要这样做。
-
<xsl:copy-of selecct="namespace::*"/> - 这会显式复制上下文节点上的所有命名空间节点。一般不需要。