我尝试使用 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 声明了默认命名空间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">
The 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 和命名空间的信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)