xslt将变量值指定给字符串文字

xslt将变量值指定给字符串文字,xslt,Xslt,我有 非常简单,变量的作用域在XSL中,并且只存在于包含标记中。因此,名为expression的变量仅存在于每个块的中。此外,变量只能设置一次。第二次尝试设置变量值无效 因此,您必须在您想要使用它的级别或更高级别声明变量,并将生成值的所有代码放在变量声明中。如果可以使用XSLT2,则以下操作将满足您的需要: Variable or parameter 'expression' is undefined. 我知道它也可以在XSLT 1中使用递归模板完成,但我手头上没有示例。在XSLT1.0中,

我有


非常简单,变量的作用域在XSL中,并且只存在于包含标记中。因此,名为
expression
的变量仅存在于每个
块的
中。此外,变量只能设置一次。第二次尝试设置变量值无效

因此,您必须在您想要使用它的级别或更高级别声明变量,并将生成值的所有代码放在变量声明中。如果可以使用XSLT2,则以下操作将满足您的需要:

 Variable or parameter 'expression' is undefined.

我知道它也可以在XSLT 1中使用递归模板完成,但我手头上没有示例。

在XSLT1.0中,可以尝试如下设置变量:

string-join(for $n in ancestor-or-self::* return name($n), '/')

/
因此,假设以下XML结构

  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
     </xsl:for-each>
  </xsl:variable>

5.
9
12
14
15
如果您位于值为14的b元素上,则表达式将设置为/As/a/Bs/b

但是,这并没有考虑具有相同名称的多个节点,因此如果您希望使用准确的XPath来选择节点,这是不够的

相反,您可以尝试以下方法:

<As>
   <a>
      <Bs>
         <b>5</b>
      </Bs>
   </a>
   <a>
      <Bs>
         <b>9</b>
      </Bs>
   </a>
   <a/>
   <a>
      <Bs>
         <b>12</b>
         <b>14</b>
         <b>15</b>
      </Bs>
   </a>
</As>

/
[
]

这将返回/As[1]/a[4]/Bs[1]/b[2],这可能是您想要的。

当您说某件事不起作用时,一定要准确地说您做了什么以及效果如何。在不知道症状的情况下,我们无法诊断问题。不要只是展示那些不起作用的代码:解释一下你想要达到的目的。我已经删除了我以前的答案,因为新的信息使它变得无关紧要。相反,看起来您希望表达式包含所有祖先名称的串联列表,但我不确定。毫无疑问,您可以发布一个示例输入XML以及预期的输出吗?谢谢。我的要求是:我想将当前节点的路径从根节点发送到服务器,以便使用此路径删除节点。例如从xml中删除第三类的第五个子标记。所以我所做的是在分类上迭代,在分类中,在子标记上有另一个迭代器。现在我想在这个子标记中找到节点的xpath。
 Variable or parameter 'expression' is undefined.
string-join(for $n in ancestor-or-self::* return name($n), '/')
  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
     </xsl:for-each>
  </xsl:variable>
<As>
   <a>
      <Bs>
         <b>5</b>
      </Bs>
   </a>
   <a>
      <Bs>
         <b>9</b>
      </Bs>
   </a>
   <a/>
   <a>
      <Bs>
         <b>12</b>
         <b>14</b>
         <b>15</b>
      </Bs>
   </a>
</As>
  <xsl:variable name="expression">
     <xsl:for-each select="ancestor-or-self::*">
        <xsl:text>/</xsl:text>
        <xsl:variable name="name" select="name()"/>
        <xsl:value-of select="$name"/>
        <xsl:text>[</xsl:text>
        <xsl:value-of select="count(preceding-sibling::*[name() = $name]) + 1"/>
        <xsl:text>]</xsl:text>
     </xsl:for-each>
  </xsl:variable>