【问题标题】:Assigning a string to a variable depending on condition in xslt根据xslt中的条件将字符串分配给变量
【发布时间】:2012-07-04 05:01:46
【问题描述】:

如果特定属性返回特定值,我想为变量赋值。在这里,如果 pr:all/[@pr:name=current()/@cx:name]/pr:properties/(@ls:middlename) 是“cengie”,我想在这里将值“young”分配给可变的“person” ”。这可能吗?

<xsl:variable
  name='person' select='pr:all/[@pr:name=current()/@cx:name]/pr:properties/(@ls:middlename)'>
</xsl:variable>

【问题讨论】:

  • XSLT 不会“分配”和“返回”,它会匹配和转换。也许是措辞上的细微差别,也许是范式误解。
  • XSLT 谈到将变量“绑定”到一个值。 “绑定”和“赋值”之间的区别在于,变量一被声明就绑定到一个值,并且只要它在范围内,就一直绑定到相同的值。当然,绑定它的值可以由运行时计算的条件表达式确定。
  • 感谢迈克尔的解释!

标签: xml xslt xpath xslt-1.0 xslt-2.0


【解决方案1】:

您可以将任何 xslt 代码放在 xsl:variable 中,结果将分配给变量。在这种情况下,您可以使用 xsl:if 来检查您的状况

<xsl:variable name="person"> 
    <xsl:if test="pr:all[@pr:name=current()/@cx:name]/pr:properties[@ls:middlename='cengie']">
       <xsl:text>young</xsl:text>
    </xsl:if>
</xsl:variable> 

如果您想在此处使用“其他”情况,则可以改用 xsl:choose

【讨论】:

  • 感谢您的回答。如果“xsl:if test”为假,你能告诉我变量的值是多少吗?
  • 如果答案为假,则变量将为空。实际上它将是一个空字符串。
  • @TimC:您注意到test 属性中的XPath 表达式在语法上无效吗?
【解决方案2】:

您可以使用use-when,它有条件地应用模板。

但是,它是在模板的“编译时”进行评估的。

检查这个:https://github.com/wildfly/wildfly/blob/master/testsuite/integration/src/test/xslt/enableTrace.xsl

<xsl:template match="//l:subsystem/l:periodic-rotating-file-handler" use-when="$trace">
    <xsl:choose>
        <xsl:when test="$trace='none'">
            ...
        </xsl:when>
        <xsl:otherwise>
            ...
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

将其应用于您的代码...

【讨论】:

  • 好吧,把它放到变量中,就是这样 - 不是吗?
  • @TimC 和 Ondra 回答了您的问题,因为它是书面和一般解释的。如果这不是您需要的答案,您将不得不更好地解释您想要什么。
【解决方案3】:
<xsl:variable   name='person' 
    select='pr:all/[@pr:name=current()/@cx:name]/pr:properties/(@ls:middlename)'>

</xsl:variable>

这在语法上是非法的 XPath —— 1.0 和 2.0。定位步骤不能以谓词开始。有问题的子字符串是:/[

另一个语法错误(这次是 XML 格式正确的错误)是上面引用的 &lt;xsl:variable&gt; 元素没有关闭。

你需要纠正这个。

除此之外,这是一个 XSLT 2.0 解决方案(上面引用的 XPath 表达式的语法和 &lt;xsl:variable&gt; 的语法已更正:

在 XSLT 2.0 中:

<xsl:variable name="person" as="xs:string?" select=
  "'young'[current()/pr:all[@pr:name=current()/@cx:name]
                                            /pr:properties
                                               [@ls:middlename='cengie']
          ]"/>

【讨论】:

  • 非常感谢您的建议。我根据你的建议改变了表达方式。感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 1970-01-01
  • 2021-08-31
  • 2013-02-23
相关资源
最近更新 更多