【问题标题】:xsl transformation from xml tag with and without namespaces从带有和不带有命名空间的 xml 标记的 xsl 转换
【发布时间】:2013-11-19 11:29:19
【问题描述】:

我尝试使用 xslt 样式表将一个 xml 文件转换为另一个 xml 文件,但是当我进行非常简单的转换时,例如

<xsl:template match="/">

    <xsl:apply-templates select="//Package" />


</xsl:template>


<xsl:template match="//Package">


    <behaviour>
        <xsl:attribute name="id"><xsl:value-of select="@Id"/></xsl:attribute>
        <xsl:attribute name="name"><xsl:value-of select="@Name" /></xsl:attribute>

        <attributes>
            <author><xsl:value-of select="./PackageHeader/Vendor"/></author>
            <date><xsl:value-of select="./PackageHeader/Created"/></date>
            <description><xsl:value-of select="./PackageHeader/Description"/></description>
            <goal></goal>
            <revision><xsl:value-of select="./RedefinableHeader/Version"/></revision>
        </attributes>

如果源xml文件的标签Package有属性,则转换没有发生,如不读取标签Package,同时如果标签没有任何属性,则转换正常运行..

有什么想法吗?我做了一些我看不到的错误? 对于转换,我使用编辑器 EditiX 2008 内部的 xsl 处理器

我的 xml 源文件的这个线程的“固有”部分是

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="xpdl2sybel.xsl"?> 
<Package xmlns:xpdl="http://www.wfmc.org/2008/XPDL2.1" xmlns="http://www.wfmc.org/2008/XPDL2.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Id="message_flow_2" Name="Message Flow 2" xsi:schemaLocation="http://www.wfmc.org/2008/XPDL2.1 http://www.yaoqiang.org/schemas/bpmnxpdl_31.xsd">
    <PackageHeader>
        <XPDLVersion>2.1</XPDLVersion>
        <Vendor>Yaoqiang</Vendor>
        <Created>2010-05-14 22:26:55</Created>
        <Description>Message Flow connecting to Flow Objects within two Pools</Description>
    </PackageHeader>
    <RedefinableHeader>
        <Version>0.03</Version>
    </RedefinableHeader>
</Package>

提前致谢!

【问题讨论】:

  • 你的 xml 源是什么?
  • 搜索“XSLT 默认命名空间”。这个问题大约每天在 StackOverflow 上被问一次。

标签: xml xslt


【解决方案1】:

您的输入 XML 具有声明为 xmlns="http://www.wfmc.org/2008/XPDL2.1" 的默认命名空间。这意味着所有没有前缀的元素都属于这个命名空间。

因此,您还应该在 XSLT 中声明名称空间。最好带前缀,像这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wfmc="http://www.wfmc.org/2008/XPDL2.1" exclude-result-prefixes="wfmc">

exclude-result-prefixes="wfmc" 不会将命名空间输出到结果 XSLT 中。现在您已经声明了命名空间,您可以使用此前缀选择属于此命名空间的节点,如下所示:

<xsl:apply-templates select="//wfmc:Package" />
<xsl:template match="//wfmc:Package">

还请注意,每次使用// 时都会遍历所有元素。为了更有效地编写一个直接找到节点的 XPath:

<xsl:apply-templates select="wfmc:Package" />
<xsl:template match="wfmc:Package">

请注意,它不是以/ 开头的,因为您已经在模板匹配的根目录上。

我还建议您阅读一些有关 XSLT 和命名空间的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多