如何在XML文件中使用带有命名空间的XSLT样式表来展平分层XML文件

时间:2014-09-18 05:12:28

标签: xml xslt

我正在与XSLT和XML斗争......在这个舞台上相当新鲜。

我有一个需要展平的多级(分层)XML文件。我构建了我的第一个XSLT文件,它使用了我为开发创建的XML文件。但是,当我将其指向预期的XML文件时,它会一直失败。我发现如果从XML文件中删除命名空间,它就可以工作。我还尝试在XSLT文件中为命名空间添加前缀,但也无法使其工作。

经过几个小时的网上搜索,并尝试各种修复......我终于不得不停下来询问方向。

我已经添加了一小段XSLT文件,我尝试选择" LoadID"以及下面的XML文件。

XSLT:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns="http://www.leanlogistics.com/DESchema/load">
<xsl:output method="xml" indent="yes" version="2.0" encoding="UTF-8"/>
<xsl:template match="/">
    <xsl:element name="LoadExtractRecords">
        <xsl:for-each select="LoadExtractRecords/LoadExtractRecord">
            <xsl:element name="LoadExtractRecord">
                <xsl:element name="LoadID">
                    <xsl:value-of select="LoadID"/>
                </xsl:element>
            </xsl:element>
        </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<LoadExtractRecords xmlns="http://www.leanlogistics.com/DESchema/load">
  <LoadExtractRecord>
    <LoadID>41955711</LoadID>
    <Company id="14188">COMPANY NAME</Company>
    <ShipperLoadRef>41955711</ShipperLoadRef>
    <Status id="1071">COMPLETED</Status>
    <Type id="1525">LOAD</Type>
    <LoadGroup id="63617">RESTOCK</LoadGroup>
    <Contact id="86226">
        <FirstName>Jennifer</FirstName>
        <LastName>Benson</LastName>
        <UserName>jenniferbenson</UserName>
    </Contact>
    <CreateDate>2011-08-28T20:56:19-04:00</CreateDate>
  </LoadExtractRecord>
</LoadExtractRecords>

上面的XSLT产生以下结果:

<?xml version="1.0" encoding="utf-8"?>
<LoadExtractRecords xmlns="http://www.leanlogistics.com/DESchema/load" />

当我删除XML文件中的命名空间时,我得到了预期的结果:

<?xml version="1.0" encoding="utf-8"?>
<LoadExtractRecords xmlns="http://www.leanlogistics.com/DESchema/load">
  <LoadExtractRecord>
    <LoadID>41955711</LoadID>
  </LoadExtractRecord>
</LoadExtractRecords>

我非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:0)

您需要为命名空间分配前缀,并在寻址源文档中的元素时使用它。尝试:

XSLT 1.0

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ld="http://www.leanlogistics.com/DESchema/load"
exclude-result-prefixes="ld">

<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/>

<xsl:template match="/">
    <LoadExtractRecords xmlns="http://www.leanlogistics.com/DESchema/load">
        <xsl:for-each select="ld:LoadExtractRecords/ld:LoadExtractRecord">
            <LoadExtractRecord>
                <xsl:copy-of select="ld:LoadID"/>
            </LoadExtractRecord>
        </xsl:for-each>
    </LoadExtractRecords>
  </xsl:template>

</xsl:stylesheet>

或者,如果您愿意:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ld="http://www.leanlogistics.com/DESchema/load"
exclude-result-prefixes="ld">

<xsl:output method="xml" indent="yes" version="1.0" encoding="UTF-8"/>

<xsl:template match="/ld:LoadExtractRecords">
    <xsl:copy>
        <xsl:for-each select="ld:LoadExtractRecord">
            <xsl:copy>
                <xsl:copy-of select="ld:LoadID"/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

注意:
1.当元素的名称已知时,您不需要使用xsl:element;
2.没有XML版本2.0;
这不是真正的“扁平化”。