如何使用 XSLT 将属性添加到 XML 中的根元素?
我想匹配根元素“FOO”并对其执行转换(添加版本属性),其余部分保持原样。到目前为止,我的转换看起来像这样:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://schemas.foo.com/fooNameSpace">
<xsl:template match="//FOO">
<xsl:choose>
<xsl:when test="@version">
<xsl:apply-templates select="node()|@*" />
</xsl:when>
<xsl:otherwise>
<FOO>
<xsl:attribute name="version">1</xsl:attribute>
<xsl:apply-templates select="node()|@*" />
</FOO>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
但是,这不会执行任何转换。它甚至没有检测到该元素。因此,我需要添加命名空间才能使其工作:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fd="http://schemas.foo.com/fooNameSpace">
<xsl:template match="//fd:FOO">
…
但这会将命名空间属性附加到 FOO 元素以及其他元素:
<FOO xmlns:fd="http://schemas.foo.com/fooNameSpace" version="1" id="fooid">
<BAR xmlns="http://schemas.foo.com/fooNameSpace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- 有没有办法说该元素正在使用默认命名空间?
- 我们可以在默认名称空间中匹配并添加元素吗?
这是原始 XML:
<?xml version="1.0" encoding="UTF-8"?>
<FOO xmlns="http://schemas.foo.com/fooNameSpace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<BAR>
<Attribute name="HEIGHT">2067</Attribute>
</BAR>
</FOO>
I want to match a root Element “FOO” and perform the transformation (add a version attribute) to it leaving the rest as it is. The Transformation I have so far looks like this:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://schemas.foo.com/fooNameSpace">
<xsl:template match="//FOO">
<xsl:choose>
<xsl:when test="@version">
<xsl:apply-templates select="node()|@*" />
</xsl:when>
<xsl:otherwise>
<FOO>
<xsl:attribute name="version">1</xsl:attribute>
<xsl:apply-templates select="node()|@*" />
</FOO>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
However this does not perform any transformation. It doesn't even detect the element. So I need to do add the namespace in order to make it work:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fd="http://schemas.foo.com/fooNameSpace">
<xsl:template match="//fd:FOO">
…
But this attaches a namespace attribute to the FOO element as well as other elements:
<FOO xmlns:fd="http://schemas.foo.com/fooNameSpace" version="1" id="fooid">
<BAR xmlns="http://schemas.foo.com/fooNameSpace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- Is there a way to say that the element is using the default namespace?
- Can we match and add elements in the default name space?
Here is the original XML:
<?xml version="1.0" encoding="UTF-8"?>
<FOO xmlns="http://schemas.foo.com/fooNameSpace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<BAR>
<Attribute name="HEIGHT">2067</Attribute>
</BAR>
</FOO>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以通过添加属性
xpath-default-namespace
指定 XPath 表达式的默认命名空间,如 5.2 XSLT 2.0 标准的表达式和模式中的无前缀 QName。例子:
You can specify the default namespace for XPath expressions by adding the attribute
xpath-default-namespace
, as described in the section 5.2 Unprefixed QNames in Expressions and Patterns of the XSLT 2.0 standard.Example:
这对我使用 xsltproc/libxslt 有效:
它产生:
This works for me using xsltproc/libxslt:
It produces:
这是一个真正符合 XSLT 精神的解决方案:
当此转换应用于所提供的 XML 文档时,就会产生所需的正确结果:
Here is one solution truly in the spirit of XSLT:
When this transformation is applied on the provided XML document, the wanted, correct result is produced: