如果变量包含一个集合,那么我该如何到达第二个项目

时间:2017-04-13 03:34:43

标签: xml xslt

如何在下面的示例中显示Hola?现在,它正在返回Hello。

xml

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="nodevariable.xslt"?> <!--todo: change this if copying to new file-->
<!--todo: change preceding line if copying to new file-->
<greetings>
  <greeting id="1">
    <can>
      <be>
        <a>
          <long itemNo="1">
            <path>Hello</path>
          </long>
          <long itemNo="2">
            <path>World</path>
          </long>
        </a>
      </be>
    </can>
  </greeting>
  <greeting id="2">
    <can>
      <be>
        <a>
          <long itemNo="1">
            <path>Hola</path>
          </long>
          <long itemNo="2">
            <path>Mundo</path>
          </long>
        </a>
      </be>
    </can>
  </greeting>
</greetings>

xsl

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

  <xsl:template match="greetings">
    <xsl:apply-templates select="greeting[@id &gt; 1]"/>
  </xsl:template>

  <xsl:variable name="testVar" select="/greetings/greeting/can/be/a/long[@itemNo=1]" />

  <xsl:template match="greeting">
    <html>
      <body>
        <h1>
          <xsl:value-of select="$testVar/path"/>
        </h1>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

您可以将testVar声明移到模板中并相对于当前位置使用它来完成此操作。

如你所知,testVar只是评估所有具有该路径的节点,其中有两个。

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

  <xsl:template match="greetings">
    <xsl:apply-templates select="greeting[@id &gt; 1]"/>
  </xsl:template>

  <xsl:template match="greeting">
    <xsl:variable name="testVar" select="can/be/a/long[@itemNo=1]" />
    <html>
      <body>
        <h1>
          <xsl:value-of select="$testVar/path"/>
        </h1>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

仅供参考,如果您想访问节点集中的第二项,可以使用[2]来执行此操作:$testVar[2]/path,但在您的示例中这样做会破坏使用模板的目的。