从另一个节点 xslt 调用值

Call value from another node xslt

我需要一些提示来完成解决方案,想象下面的(编辑 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" />

程序必须做的是 IF(来自(header)的标签(flag)包含 X)在模板 match=Event 中做一些事情。

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

无法正常工作。

亲切的问候,

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

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

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

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

不过,与其为每个 Event 计算相同的路径,不如考虑将结果存储在全局可用的变量中

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

那你就可以这样做了...

<xsl:if test="$extension">