XSLT:变量和参数未传递

时间:2013-06-17 23:11:10

标签: xslt

我有一个xslt文件,它不会传递参数,我无法弄清楚原因。

我以前做过这个,但不确定我错过了什么。

我尝试设置一个全局变量,但似乎没有设置。

我尝试传递一个已设置的局部变量,但它没有通过。我想直接去我的" SALES/SUBJECT"元素,但它会丢失变量,我记得这个问题,然后再使用内置Rules.xsl文件,所以我去了ELEMENT" SALES"首先试图绕过它,但似乎仍然去那里。但我发现在此之前参数是空白的。

XML文件是:

<?xml version="1.0"?>
<REPORT VERSION="1.30" MAJORFORM="TomsForm">
  <SALES>
    <SUBJECT LATITUDE="32.2222" LONGITUDE="-118.222222">
      <BUSINESS>Joes Bar and Grill</BUSINESS>
    </SUBJECT>
  </SALES>
</REPORT>

第一个尝试设置全局变量的XSLT文件不起作用。如果我停在&#34; majorForm&#34;设置并查看观察窗口,@MAJORFORM显示为&#34; TomsForm&#34;,它应该。但是当我走到下一行时,它是空白的。因此,在我使用它的地方,它也是空白的。

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

  <xsl:output method="xml" indent="yes"/>
  <xsl:variable name="majorForm" select="@MAJORFORM"/>

  <xsl:template match="/*">
    <xsl:copy>

      <xsl:apply-templates select="SALES/SUBJECT"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="SALES/SUBJECT">
    <xsl:for-each select ="@*">
      <xsl:if test="name() = 'LATITUDE'">
        <form>
          <formName>
            <xsl:value-of select="$majorForm"/>
          </formName>
        </form>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

在另一个文件中,我将其设置为本地文件,并将$ majorForm设置为&#34; TomsForm&#34;,但是当我在apply-templates处传递它时,它从不传递任何内容。但是代码将它视为一个有效的参数,只是它没有任何内容。

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

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/*">
    <xsl:copy>

      <xsl:variable name="majorForm" select="@MAJORFORM"/>

      <xsl:apply-templates select="SALES">
        <xsl:with-param name="mainform" select="$majorForm"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>


  <xsl:template match="SALES">
    <xsl:param name="mainForm"/>
    <xsl:for-each select ="@*">
    </xsl:for-each>
    <xsl:apply-templates>
      <xsl:with-param name="mainForm" select="$mainForm"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="SALES/SUBJECT">
    <xsl:param name="mainForm"/>
    <xsl:for-each select ="@*">
      <xsl:if test="name() = 'LATITUDE'">
        <form>
          <formName>
            <xsl:value-of select="$mainForm"/>
          </formName>
        </form>
      </xsl:if>
    </xsl:for-each>
  </xsl:template>

</xsl:stylesheet>

我之前已经这样做了,它会正常工作。

我想找出为什么这些方法都不起作用。

1 个答案:

答案 0 :(得分:1)

在第一个样式表中,变量majorForm将为空,因为表达式的上下文是根节点(文档元素上方空间中不存在的节点),它没有{{1属性。

您需要将其更改为:

@MAJORFORM

在第二个示例中,匹配<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" indent="yes"/> <xsl:variable name="majorForm" select="/*/@MAJORFORM"/> 上下文的模板是文档元素/*,它具有属性REPORT

但是,您尝试指定参数@MAJORFORM,但匹配mainform的模板有一个名为SALES/SUBJECT的参数(请注意字母“F”的大小写)。

将其更改为以下内容:

mainForm

您可以使用以下样式表实现相同的输出并简化操作:

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:variable name="majorForm" select="@MAJORFORM"/>
      <xsl:apply-templates select="SALES">
        <xsl:with-param name="mainForm" select="$majorForm"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>