如何从URI中提取前缀?

时间:2016-01-12 13:56:35

标签: xml xslt

是否存在组合前缀的方法:给定URN和本地名称的元素的本地名称?

例如使用此代码:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0" version="1.0">
    <xsl:template match="/">
        <root>
        <xsl:element name="element" namespace="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0">
            <nested-element>Some text...</nested-element>
        </xsl:element>
        </root>
    </xsl:template>
</xsl:stylesheet>

我得到的结果是:

<root xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0">
    <element xmlns="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0">
        <nested-element xmlns="">Some text...</nested-element>
    </element>
</root>

我想要的结果是:

<root xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0">
    <fo:element>
        <nested-element>Some text...</nested-element>
    </fo:element>
</root>

将URI提供给xsl:元素,该名称具有神奇的前缀(使用与该URI对应的前缀 - 在根元素中声明),并且URI不存在于结果文档中。我希望你明白我想要实现的目标:)

1 个答案:

答案 0 :(得分:0)

我假设您有理由明确使用<xsl:element />,而不是直接声明<fo:element>元素。

XSLT 1.0 specification允许<xsl:element /> @name属性to be a qname。因此,您可以通过以通常的方式将其前缀添加到元素 @name 来重用已经声明的命名空间:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0" 
    version="1.0">

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:element name="fo:element">
                <nested-element>Some text...</nested-element>
            </xsl:element>
        </root>
    </xsl:template>
</xsl:stylesheet>

XSLT 1.0处理器将安全地检查前缀是否已声明。

在Saxon 6.5.5中测试过代码。