我正在与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>
我非常感谢任何帮助。 感谢
答案 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;
这不是真正的“扁平化”。