【问题标题】:XSLT: Variables and Parameters not passingXSLT:变量和参数未通过
【发布时间】:2013-06-17 23:11:10
【问题描述】:

我有一个 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>

我以前做过,效果很好。

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

【问题讨论】:

    标签: xslt


    【解决方案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>
    

    【讨论】:

    • 就是这样。我知道这是案例问题,但由于某种原因看不到它。无论如何,在全球问题上 - 我很困惑,因为我正在跟踪进度,并且由于某种原因,监视窗口正确显示 @MAJORFORM 而没有前面的字符。 “/*/”有什么作用?我知道当我在副本的顶部执行模板语句时,我使用“/*”,我认为它表示给我整个文档。另一方面不确定。但它确实奏效了。谢谢。
    • "/*" 匹配文档元素(第一个,“最外层”元素)。当您使用以“/”开头的 XPath 时,它会“跳转”到文档的顶部并从根节点开始。 "/*/@MAJORFORM" 选择附加到该文档元素的属性。
    猜你喜欢
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多