2015-10-20 41 views
0

我有几个xhtmls来自我需要解析的不同系统,我决定使用转换将它们全部转换为我的应用程序可以解析的标准xml格式,进口。我设法得到一个工作,但第二个有什么问题,我不知道是什么,因为我复制粘贴代码。XLST句子不匹配的原因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.我实际上在第二个选择使用不同的选择,但我需要的是没有带来任何结果,所以我将其更改为此调试,这也没有工作,所以我假设任何修复此问题将也为真正的选择解决问题。

+2

请张贴足够的代码( XML + XSL)使我们能够重现问题。请参阅:http://stackoverflow.com/help/mcve --- P.S.如果我不得不猜测,我会说你的第二个XML的元素是在* namespace *中。 –

+0

添加了更多细节,但我无法发布整个xml文件。我如何找到命名空间?我如何改变这个转变来适应它呢?我是XSLT新手,所以我可能会忽略“明显”的事情。 – PedroC88

+1

好吧,现在你表明**两个**都在xhtml命名空间('xmlns =“http://www.w3.org/1999/xhtml”') - 所以我没有看到你的第一个转换可以如何正在工作。我建议你做一个搜索,因为有*许多*以前的答案解释如何处理名称空间(例如:http://stackoverflow.com/questions/22590320/not-getting-data-to-transform-xml/22590777# 22590777) –

回答

1

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

要处理使用一个命名空间的输入,您必须声明的命名空间在样式表中,为它分配一个前缀和使用解决文档节点时的前缀 - 在这里看到一个例子:Not getting data to transform Xml