2

我有一个 xslt 文件,它不会传递参数,我不知道为什么。

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

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

我尝试传递一个已设置的局部变量,但它没有通过。我想直接进入我的“ SALES/SUBJECT”元素,但它会丢失变量,我记得这个问题在处理内置 Rules.xsl 文件之前,所以我先去元素“ 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 文件不起作用。如果我停在设置“majorForm”的行并查看监视窗口,@MAJORFORM显示为“TomsForm”,它应该。但是当我走到下一行时,它是空白的。所以在我使用它的地方再往下,它也是空白的。

<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 设置为“TomsForm”,但是当我在应用模板中传递它时,它永远不会传递任何东西。但是代码将其视为有效参数,只是其中没有任何内容。

<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>

我以前做过这个,它会工作得很好。

我想知道为什么这些方法都不起作用。

4

1 回答 1

1

在您的第一个样式表中,该变量majorForm将为空,因为您的表达式的上下文是根节点(文档元素上方空间中不存在的节点),它没有@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有一个名为的参数mainForm(注意字母“F”的大写)。

将其更改为以下内容:

  <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:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0"> 
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="REPORT">
        <xsl:copy>           
            <xsl:apply-templates select="SALES/SUBJECT/@LATITUDE">
                <xsl:with-param name="mainForm" select="@MAJORFORM"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="SALES/SUBJECT/@LATITUDE">
        <xsl:param name="mainForm"/>
        <form>
            <formName>
                <xsl:value-of select="$mainForm"/>
            </formName>
        </form>
    </xsl:template>

</xsl:stylesheet>
于 2013-06-18T00:43:48.147 回答