如何在for-each中迭代for-each,其中outer for-each是一个变量

时间:2018-03-22 11:56:12

标签: xml xslt-1.0

我已经看到了question,我认为这是我问题的答案。

这只是目前的测试代码。我有一个虚拟的XML数据文件:

<?xml version="1.0" encoding="UTF-8"?>
<NamesToHighlight Version="180900" xmlns="http://www.publictalksoftware.co.uk/msa">
    <Name>Mr Happy</Name>
    <Name>Mr Grumpy</Name>
</NamesToHighlight>

这个文件链接到我的XSL,我只是在这个阶段进行测试。现在,这段代码可以运行:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:msa="http://www.publictalksoftware.co.uk/msa">
  <xsl:output method="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>

  <xsl:variable name="Names" select="document('NamesToHighlight.XML')"/>

  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
        <link rel="stylesheet" type="text/css" href="Workbook-S-140.css"/>
        <title>Title of Schedule</title>
      </head>
      <body>
        <xsl:for-each select="MeetingWorkBook/Meeting">
          <div class="containerPage">
            <p>
              <xsl:value-of select="WeeklyBibleReading"/>
            </p>
          </div>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

它正确地显示了4个圣经阅读参考:

Test 1

但如果我试试这个:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:msa="http://www.publictalksoftware.co.uk/msa">
  <xsl:output method="html" indent="yes" version="4.01"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
    doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>

  <xsl:variable name="Names" select="document('NamesToHighlight.XML')"/>

  <xsl:template match="/">
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
        <link rel="stylesheet" type="text/css" href="Workbook-S-140.css"/>
        <title>Title of Schedule</title>
      </head>
      <body>
        <xsl:for-each select="$Names/msa:NamesToHighlight/msa:Name">
          <xsl:variable name="NameToHighlight" select="."/>
          <p>
            <xsl:value-of select="$NameToHighlight"/>
          </p>
            <xsl:for-each select="MeetingWorkBook/Meeting">
              <div class="containerPage">
                <p>
                <xsl:value-of select="WeeklyBibleReading"/>
              </p>
              </div>
            </xsl:for-each>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

现在只显示名称:

Test 2

我认为这与链接的问题有关,所以我尝试了:

<xsl:for-each select="/MeetingWorkBook/Meeting">

但它没有任何区别。我甚至尝试使用//作为前缀,这没有任何区别。我假设&#34;上下文&#34;是&#34;变量&#34;我在迭代。我该如何处理?

我不确定我能不能做我想做的事。似乎我可能不得不改变我的应用程序逻辑并使名称列表实际上成为&#34; MeetingWorkBook&#34; XML文件。但我会等着看是否有人对此有任何建议。

目前我已经解决了这个问题。如果我将外部XML中的名称列表移动到计划中,那么我可以使用两个带有 root 路径的for-each循环。一切都好。

1 个答案:

答案 0 :(得分:1)

您可以尝试将当前XML放在变量中,例如:

<xsl:variable name="curr_document" select="."/>

并在后面的第二个for-each循环中引用

<xsl:for-each select="$curr_document/MeetingWorkBook/Meeting">

您的XSLT应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:msa="http://www.publictalksoftware.co.uk/msa">
    <xsl:output method="html" indent="yes" version="4.01"
        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
        doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>

    <xsl:variable name="Names" select="document('NamesToHighlight.XML')"/>

    <xsl:template match="/">
        <xsl:variable name="curr_document" select="."/>
        <html xmlns="http://www.w3.org/1999/xhtml">
            <head>
                <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
                <link rel="stylesheet" type="text/css" href="Workbook-S-140.css"/>
                <title>Title of Schedule</title>
            </head>
            <body>
                <xsl:for-each select="$Names/msa:NamesToHighlight/msa:Name">
                    <xsl:variable name="NameToHighlight" select="."/>
                    <p>
                        <xsl:value-of select="$NameToHighlight"/>
                    </p>
                    <xsl:for-each select="$curr_document/MeetingWorkBook/Meeting">
                        <div class="containerPage">
                            <p>
                                <xsl:value-of select="WeeklyBibleReading"/>
                            </p>
                        </div>
                    </xsl:for-each>
                </xsl:for-each>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>