我对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>
答案 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
。