来自另一个节点xslt的调用值

时间:2018-08-22 14:34:38

标签: xml xslt transform transformation

在这里我需要一些技巧来完成解决方案,想象一下下面的(仅用于显示提议的EDIT 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((标题)中的标记(标志)包含X)在模板match = Event内执行某项操作,则程序必须执行的操作。

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

它不能正常工作。

问候,

1 个答案:

答案 0 :(得分:0)

您当前的表达式是相对于当前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">