遍历节点XSLT

时间:2015-05-21 15:02:43

标签: xml xslt

我对xslt不太熟悉。我试图遍历一个节点来打印问题,我在一个单独的节点中得到了答案。我需要在与问题ID

匹配后找到答案
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<details>
 <detail>
  <answersall>
    <answers>
        <question id="1"/>
        <answer>4</answer>
        <note>test</note>
    </answers>
    <answers>
        <question id="2"/>
        <answer>2</answer>
    </answers>
   </answersall>
  <detail>
  <questions>
   <question id="1" text="Hello how are you" section="a"/>
   <question id="2" text="how was your day" section="a"/>
 <questions>
<details>

我正在尝试打印这样的东西 Question Answer
Hello How are you 4
How was you day 2
我能够使用XSL打印每个问题,但我不知道如何找到答案。 我必须能够匹配问题ID,然后转到下一个节点并找到答案并打印出来。

到目前为止,我已经使用了xsl

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
    <html>
      <body>
        <h2><center>Details</center></h2>
         <table>
             <xsl:for-each select="details/questions/question[@section='a']">
                 <tr>
                    <td><xsl:value-of select="@text"/></td>
                    <td>????</td>
                 </tr>
             </xsl:for-each>
         </table>
      </body>
    </html>
   </xsl:template>
</xsl:stylesheet>

2 个答案:

答案 0 :(得分:2)

以下是使用<xsl:key>的解决方案:

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

  <xsl:key name="answers" match="question" use="@id"/>

  <xsl:template match="/">
    <html>
      <body>
        <h2><center>Details</center></h2>
        <table>
          <xsl:for-each select="details/questions/question[@section='a']">
            <tr>
              <td><xsl:value-of select="@text"/></td>
              <td><xsl:value-of select="key('answers',@id)/following-sibling::answer/text()"/></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

我认为你的XML使得任务比它需要的更难,因为你在一个元素上基本上有一个ID,它与它应该在的元素相邻。我认为这个XML更简单:

<?xml version="1.0" encoding="ISO-8859-1"?>
<details>
  <answersall>
    <answers>
      <answer for="1">4</answer>
      <answer for="2">2</answer>
    </answers>
  </answersall>
  <questions>
   <question id="1" text="Hello how are you" section="a"/>
   <question id="2" text="how was your day" section="a"/>
  </questions>
</details>

然后我们可以用这个替换复杂的XPath语句以获得答案:

<xsl:value-of select="key('answers',@id)/text()"/>

这里的技巧是使用xsl:key为要查找的元素生成一种索引。与全球搜索相比,这具有积极的性能影响(如@Zachary Young的回答所使用的那样),尽管我怀疑这种好处对于小型文档来说意义重大。

答案 1 :(得分:1)

您需要使用问题的id来找到答案。你可能已经知道了很多。以下是:

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2><center>Details</center></h2>
        <table>
          <xsl:for-each select="details/questions/question[@section='a']">
            <tr>
              <td><xsl:value-of select="@text"/></td>
              <td>
                <xsl:variable name="id" select="@id"/>
                <xsl:value-of select="//answers[question/@id=$id]/answer"/>
              </td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

我选择了问题id并将其放入变量中,然后使用该变量找到具有相同问题ID的答案://answers[question/@id=$id]/answer搜索所有{{1}匹配answers 谓词(在XPath中,谓词说明节点的某些内容,即该节点的条件)。由于您的ID是唯一的,我们希望只找到一个[question/@id=$id]节点。找到该节点后,会进一步遍历answers

我也不熟练使用XSL,因此可能没有必要在下一行中使用的变量中捕获问题/answer

相关问题