在XSLT中使用for-each选择节点的属性

时间:2014-11-27 09:40:22

标签: xml xslt xhtml

我有一个要求,我需要准备带有问题和答案列表的XML。一个eform可以有多个文档。每个文档可以有多个问题。

我已为此准备了两个XML。请建议哪一个是好方法。

XML 1

<?xml version="1.0" encoding="utf-8"?>
<Eform>
    <Documents>
        <Document ID="c7ba73bb-c096-4099-ad70-fd47d2320d00">
            <Questions>
                <Question ID="1a4eb1e0-f657-483e-a8fa-59e9002d7c3f" Title="Doc 1 - Question 1 - Paraghraph" Answer="abc" />
                <Question ID="d43fcf9d-91f6-43ce-b970-737aa0a51d36" Title="Doc 1 - Question 2 - Date" Answer="2014-10-08T18:30:00Z" />
            </Questions>
        </Document>
        <Document ID="12d726d9-6e77-4657-ab8c-dddb7104a14a">
            <Questions>
                <Question ID="3a9d6172-90b6-420d-911a-43857e7c21a2" Title="Doc 2 - Question 1 - SelectList" Answer="Option 03" />
                <Question ID="e4ae1e80-3fd5-4f6a-8d57-29166e399deb" Title="Doc 2 - Question 2 - File" Answer="" />
            </Questions>
        </Document>
        <Document ID="9e3e79d0-0417-4ecd-8d5f-1881a5045705">
            <Questions>
                <Question ID="3b6c296e-8cc3-4ba5-9b16-7b5d0bfa6ce0" Title="Doc 3 - Question 1 - Text" Answer="abc" />
            </Questions>
        </Document>
        <Document ID="328cae06-13c4-425e-adc0-e7c32d89b044">
            <Questions>
                <Question ID="d9877c67-12fc-4058-8dfe-3997335bce02" Title="Dropdown List" Answer="option 05" />
                <Question ID="a56aae48-94b8-43d7-b17e-5eb0d16aeebb" Title="CheckBox List" Answer="Option 03" />
                <Question ID="02ea17f1-8c34-4916-89ab-d6dfaf37a403" Title="RadioButton List" Answer="Option 03" />
            </Questions>
        </Document>
    </Documents>
</Eform>

XML 2

    <?xml version="1.0" encoding="utf-8"?>
<Eform>
    <Document ID="c7ba73bb-c096-4099-ad70-fd47d2320d00">
            <Question> 
                <ID>1a4eb1e0-f657-483e-a8fa-59e9002d7c3f</ID>
                <Title>Doc 1 - Question 1 - Paraghraph</Title>
                <Answer>abc</Answer>
            </Question> 
            <Question> 
                <ID>d43fcf9d-91f6-43ce-b970-737aa0a51d36</ID>
                <Title>Doc 1 - Question 2 - Date</Title>
                <Answer>2014-10-08T18:30:00Z</Answer>
            </Question> 
    </Document>
    <Document ID="12d726d9-6e77-4657-ab8c-dddb7104a14a">
            <Question> 
                <ID>3a9d6172-90b6-420d-911a-43857e7c21a2</ID>
                <Title>Doc 2 - Question 1 - SelectList</Title>
                <Answer>Option 03</Answer>
            </Question> 
            <Question> 
                <ID>e4ae1e80-3fd5-4f6a-8d57-29166e399deb</ID>
                <Title>Doc 2 - Question 2 - File</Title>
                <Answer></Answer>
            </Question> 
    </Document>
</Eform>

我想为上述任何一种XML生成XSLT,以便按如下方式生成HTML:

Question 1
Answer of Question 1

Question 2
Answer of Question 2

我第一次使用XML并尝试一些事情。尝试生成XSLT XML2如下。但没有提供所需的输出。

<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited by XMLSpy® -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
      <xsl:for-each select="Eform/Document">
 <xsl:for-each select="Question">
        <p><b><xsl:value-of select="Title"/></b></p>
        <p><xsl:value-of select="Answer"/></p>
        <br/>
 </xsl:for-each>
      </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

请建议正确的方法以及如何在XSLT中使用嵌套的foreach选择属性/值。如果还有其他更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

对于您的第一种格式,请尝试:

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

<xsl:template match="/">
    <html>
        <body>
            <xsl:for-each select="Eform/Documents/Document/Questions/Question">
                <p><b><xsl:value-of select="@Title"/></b></p>
                <p><xsl:value-of select="@Answer"/></p>
                <br/>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>

你的第二种格式不是很好;如果是的话,这将适用于它:

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

<xsl:template match="/">
    <html>
        <body>
            <xsl:for-each select="Eform/Document/Question">
                <p><b><xsl:value-of select="Title"/></b></p>
                <p><xsl:value-of select="Answer"/></p>
                <br/>
            </xsl:for-each>
        </body>
    </html>
</xsl:template>

</xsl:stylesheet>