XSLT匹配父和子

时间:2013-05-30 13:40:22

标签: xml xslt

我有以下XML,我想提取所有 title_en 属性。

<quiz>
    <question title_de="Seit wann wird Appenzeller® Käse hergestellt?" 
              title_fr="Depuis quand le fromage d’Appenzell est-il fabriqué?" 
              title_en="For how long has Appenzeller cheese been made?" >
        <answer title_de="Über 7 Jahre!" title_fr="Depuis plus de 7 ans !" title_en="For over 7 years !"></answer>
        <answer title_de="Über 70 Jahre!" title_fr="Depuis plus de 70 ans !" title_en="For over 70 years !"></answer>
        <answer title_de="Über 700 Jahre!" title_fr="Depluis plus de 700 ans !" title_en="For over 700 years !"></answer>
    </question>
 </quiz>        

这是我的XSLT:

                                                                                         

  <xsl:template match="answer">
    <tr>
      <td><xsl:value-of select="@title_en"/></td>
    </tr>        
  </xsl:template>   

  <xsl:template match="question">
    <tr>
      <td><xsl:value-of select="@title_en"/></td>
    </tr>        
  </xsl:template> 

我可以从问题或答案中获取属性,但绝不能从两者中获取。我尝试过所有类型的匹配声明

2 个答案:

答案 0 :(得分:2)

您似乎只包含了XSLT的一部分,也许这就是您要寻找的内容:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/quiz">
        <xsl:apply-templates select="question"/>
    </xsl:template>
    <xsl:template match="answer">
        <tr>
            <td>
                <xsl:value-of select="@title_en"/>
            </td>
        </tr>
    </xsl:template>
    <xsl:template match="question">
        <tr>
            <td>
                <xsl:value-of select="@title_en"/>
                <xsl:apply-templates select="answer"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

我认为你错过了问题模板中的<xsl:apply-templates select="answer"/>。您需要修改HTML,因为现在在问题TD中输出TR标记如下:

<tr>
    <td>For how long has Appenzeller cheese been made?<tr>
            <td>For over 7 years !</td>
        </tr>
        <tr>
            <td>For over 70 years !</td>
        </tr>
        <tr>
            <td>For over 700 years !</td>
        </tr>
    </td>
</tr>

答案 1 :(得分:0)

PLS。尝试类似的事情:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="quiz">
    <xsl:choose>
      <xsl:when test="question[@title_en]">
        <xsl:apply-templates/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="question/answer"/>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

  <xsl:template match="answer">
    <tr>
      <td>
        <xsl:value-of select="@title_en"/>
      </td>
    </tr>
  </xsl:template>

  <xsl:template match="question">
    <tr>
      <td>
        <xsl:value-of select="@title_en"/>
      </td>
    </tr>
  </xsl:template>
</xsl:stylesheet>