2016-04-08 59 views
1

我有一个XML文件过滤XML使用XSLT不工作

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl" href="main.xsl"?> 
<document> 
    <parents> 
     <parent> 
      <name>Jordan</name> 
      <age>25</age> 
      <childs> 
       <child eyes="black"> 
        <name>Ema</name> 
       </child> 
       <child eyes="blue"> 
        <name>Kaloyan</name> 
       </child>     
      </childs> 
     </parent> 
    </parents> 
</document> 

,我想使用XSL文件main.xsl过滤:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" /> 
    <xsl:include href="child.xsl" /> 
    <xsl:template match="/"> 
     <html> 
      <head> 
       <title>Head first</title> 
      </head> 
      <body> 
       <table border="1"> 
        <xsl:for-each select="document/parents/parent"> 
         <tr> 
          <td> 
           <xsl:text disable-output-escaping="yes">Name</xsl:text> 
          </td> 
          <td> 
           <xsl:value-of select="name"></xsl:value-of> 
          </td> 
         </tr> 
         <tr> 
          <td> 
           <xsl:text disable-output-escaping="yes">Age</xsl:text> 
          </td> 
          <td> 
           <xsl:value-of select="age"></xsl:value-of> 
          </td> 
         </tr> 
         <xsl:for-each select="childs/child"> 
          <xsl:variable name="obj" select="."></xsl:variable> 
          <xsl:apply-templates select="//child[@eyes = 'black']" mode="child"> 
           <xsl:with-param name="obj" select="$obj"></xsl:with-param> 
          </xsl:apply-templates> 
         </xsl:for-each> 
        </xsl:for-each> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 
</xsl:stylesheet> 

指向child.xsl文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template name="child"> 
     <xsl:param name="obj"></xsl:param> 
     <h3><xsl:text disable-output-escaping="yes">Child name</xsl:text> </h3> 
     <h4><xsl:value-of select="$obj/name"></xsl:value-of></h4> 
    </xsl:template> 
</xsl:stylesheet> 

所需的结果是只看到一个孩子的名字是Ema但我看到Ema两次:

<html> 

<head> 
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> 
    <title>Head first</title> 
</head> 

<body> 
    <table border="1"> 
    <tbody> 
     <tr> 
     <td>Name</td> 
     <td>Jordan</td> 
     </tr> 
     <tr> 
     <td>Age</td> 
     <td>25</td> 
     </tr> 
     Ema Ema 
    </tbody> 
    </table> 
</body> 

</html> 

有谁知道为什么会发生这种情况?

+1

为什么你禁用输出转义为简单的字符串,如“名称”或“年龄”,不需要转义? –

+0

没有像这样写的目的。这是真实脚本问题的一个例子。 –

回答

1

原因是你迭代childs/child<xsl:for-each>和有两个<child>元素。因此<xsl:apply-templates select="//child[@eyes = 'black']" mode="child">被执行两次,你会得到两个Ema s。

+0

它没有任何意义。我有一个循环,我想只匹配元素与attr eyes = black –

+0

你能提出一个解决方案,我只会看到一次过滤器的孩子? –

+1

是的。只要删除'xsl:for-each'。 'xsl:apply-templates select =“// child ...”'已经选择了所有具有黑眼睛属性的'child'元素。它使用此属性在_all_'child'元素上应用模板。 – zx485