我不明白为什么我没有这个全局变量的范围,还有其他选择吗?

时间:2016-03-30 21:25:07

标签: xml xslt-1.0

我有这个XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="aj.xsl"?>
<Test>
  <Highlight>
    <HighlightName>Name 1</HighlightName>
    <HighlightName>Name 2</HighlightName>
    <HighlightName>Name 3</HighlightName>
    <HighlightName>Name 5</HighlightName>
    <HighlightName>Name 6</HighlightName>
  </Highlight>
  <Date>
    <Name>Name 1</Name>
  </Date>
  <Date>
    <Name>Name 6</Name>
  </Date>
  <Date>
    <Name>Name 2</Name>
  </Date>
  <Date>
    <Name>Name 7</Name>
  </Date>
  <Date>
    <Name>Name 3</Name>
  </Date>
  <Date>
    <Name>Name 8</Name>
  </Date>
  <Date>
    <Name>Name 4</Name>
  </Date>
  <Date>
    <Name>Name 9</Name>
  </Date>
  <Date>
    <Name>Name 5</Name>
  </Date>
</Test>

还有一些测试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">
  <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: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-Version2.css"/>
        <title>Test</title>
      </head>
      <body>
        <xsl:for-each select="Test/Highlight/HighlightName">
          <xsl:variable name="strHighlightName" select="."/>
          <p>Start of list for {$strHighlightName}</p>
          <xsl:for-each select="Test/Date">
            <xsl:apply-templates select="Name"/>
          </xsl:for-each>
       </xsl:for-each>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Name">
    <p>
      <xsl:if test="$strHighlightName=.">
        <xsl:text>**</xsl:text>
      </xsl:if>
      <xsl:value-of select="."/>
    </p>

  </xsl:template>
</xsl:stylesheet>

样本很短,无法传达问题。在最后的场景中,我的文件更加详细。

我试图实现的基本概念是遍历我想要突出显示的已知名称列表。然后,除其他事项外,我想表明其他地方的名字是否是其中一个突出的名称。所以我尝试了上述内容,但遗憾的是名称模板无法看到变量 strHighlightName

我意识到我可以使用参数并将值输入到模板中,但在现实世界中,我必须将此参数级联到模板中才能调用名称。

由于我不能使用这种方法,我可以采用不同的方式吗?例如,我可以这样做吗:

<xsl:template match="Name">
    Does "." match any of the names in the "//Highlight/HighlightName" section?
    If yes
        Text "** "
</xsl:template>

这有意义吗?它将避免需要变量和/或传递参数。

谢谢。

1 个答案:

答案 0 :(得分:1)

I realise I can use parameters and feed the value in to the template, but in the real world I would have to cascade this param all the way down into the template can calls Name.

在XSLT 1.0中,您需要将所有中间模板级联起来。

在XSLT 2.0中,您可以使用隧道参数,隧道参数从第一个模板到第二个模板,无需在所有中间模板中明确提及。

因此,请查看您的应用程序环境中是否有XSLT 2.0处理器。