从另一个节点 xslt 调用值

Posted

技术标签:

【中文标题】从另一个节点 xslt 调用值【英文标题】:Call value from another node xslt 【发布时间】:2019-01-28 20:33:54 【问题描述】:

我需要一些技巧来完成解决方案,想象一下(编辑 XML 仅用于展示建议):

<root>
<header>
  <Document>
      ... many tags
  <Document>
  <extension>
     <flag>X</flag>
  </extension>
</header>
<body> 
   <List> 
      <Object>
         ... many tags
        <extension>
         ... many tags
        </extension>
      </Object>
      <Event>
         ... many tags
        <extension>
          ... many tags
        </extension>
      </Event>
   </List>
</body>

我有这个 XSLT:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="Event">
    <xsl:copy>
        <xsl:apply-templates />
                <xsl:if test="header/extension[flag = 
                  'X']">
                DO SOMETHING
                </if>
    </xsl:copy>
</xsl:template>

<xsl:template match="//Object" />

程序必须做的是如果(来自 (header) 的标记 (flag) 包含 X)在模板 match=Event 内做某事。

我已经尝试过:header/extension[flag ='X'] and ../extension/flag = 'X' and header/extension/flag = 'X'

它不能正常工作。

亲切的问候,

【问题讨论】:

【参考方案1】:

您当前的表达式相对于当前的Event 节点,而header 不是EventNode 的子节点。

您需要使表达式相对于“文档”节点,因此它实际上是一个绝对路径

<xsl:if test="/root/header/extension[flag = 'X']">

(显然您需要更正您的 XSLT,因为您当前有一个结束 &lt;/if&gt; 标记,而不是 &lt;xsl:if&gt;

您可以考虑将结果存储在全局可用的变量中,而不是为每个 Event 评估相同的路径

 <xsl:variable name="extension" select="/root/header/extension[flag = 'X']" />

那么你就可以这样做了……

<xsl:if test="$extension">

【讨论】:

现在我明白我做错了什么。但是 [ ] 是什么意思,我想我不能使全局变量,因为这个 可以包含其他值,X 只是示例,但我在这里做了 poc 并且可以工作。谢谢你的提示 ! ;) 你可以定义变量&lt;xsl:variable name="extension" select="/root/header/extension/flag" /&gt;,然后你的if语句可以是&lt;xsl:if test="$extension = 'X' or $extension = 'Y'" /&gt;。或者在 XSLT 2.0 中你可以这样做 &lt;xsl:if test="$extension=('X', 'Y')" /&gt;

以上是关于从另一个节点 xslt 调用值的主要内容,如果未能解决你的问题,请参考以下文章

使用xslt和c#从中选择​​一个xml节点并根据其值添加更多节点[重复]

循环遍历节点并使用 XSLT 将值附加到字符串

XSLT 将来自多个节点的属性连接成单个值

XSLT muenchian 在子节点中按值分组

根据 XSLT 中的特定节点值获取节点

使用 XSLT 组合具有相同 ID 及其值的节点 (XML)