XLST句子与XML不匹配的原因

时间:2015-10-20 05:15:06

标签: xml xslt

我有几个xhtmls来自我需要解析的不同系统,我决定使用转换将它们全部转换为标准的xml格式,然后我的应用程序可以解析和导入。我设法让一个工作,但第二个问题出了问题,我不知道是什么,因为我复制粘贴了代码。

让我们看一下第一个xml和转换的摘录:

XML

<html xmlns="http://www.w3.org/1999/xhtml">
<!-- some really deep tree structure including a table -->
    <table border="0" cellpadding="4" cellspacing="0" width="100%" class="md-maketable">
        <tbody>
            <tr valign="middle" class="md-maketable-reg-tr">
                <!-- some tds inside -->
            </tr>
            <tr valign="middle" class="md-maketable-reg-tr">
                <!-- some tds inside -->
            </tr>
            <!-- these trs repeat n number of times -->
        </tbody>
    </table>
</html>

转化

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="no" indent="yes"/>

    <xsl:template match="/">
        <movements>
            <xsl:for-each select="//tr[@class=&quot;md-maketable-reg-tr&quot;]">
                <movement>
                    <!-- parsing some movements (uninteresting) -->
                </movement>
            </xsl:for-each>
        </movements>
    </xsl:template>
</xsl:stylesheet>

结果

<?xml version="1.0" encoding="utf-8"?>
<movements>
      <movement>
         <!-- some movement data -->
      </movement>
</movements>
<!-- n number of movements -->

现在进入第二个

XML

<html xmlns="http://www.w3.org/1999/xhtml">
<!-- some really deep tree structure including a table -->
    <table id="transactions" border="0" cellpadding="1" cellspacing="1" width="100%">
        <tbody>
            <tr id="tr:1" class="interlaceOne">
                <!-- some tds inside -->
            </tr>
            <tr id="tr:2" class="interlaceOne">
                <!-- some tds inside -->
            </tr>
            <!-- these trs repeat n number of times -->
        </tbody>
    </table>
</html>

转化

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="no" indent="yes"/>

    <xsl:template match="/">
        <movements>
            <xsl:for-each select="//tr[@class=&quot;interlaceOne&quot;]">
                <movement>
                    <!-- parsing some movements (uninteresting) -->
                </movement>
            </xsl:for-each>
        </movements>
    </xsl:template>
</xsl:stylesheet>

结果

<?xml version="1.0" encoding="utf-8"?>
<movements>
</movements>

P.S。我实际上在第二个上使用了不同的选择,但是我需要的那个没有带来任何结果,所以我把它改为调试哪个也行不通,所以我假设这个问题会有什么问题。也解决了真正选择的问题。

1 个答案:

答案 0 :(得分:1)

显然,您的XML输入位于XHTML命名空间(xmlns="http://www.w3.org/1999/xhtml")中。

要处理使用命名空间的输入,您必须在样式表中声明命名空间,为其分配前缀并在寻址文档节点时使用该前缀 - 请参阅此处的示例:Not getting data to transform Xml