在这里我需要一些技巧来完成解决方案,想象一下下面的(仅用于显示提议的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'
它不能正常工作。
问候,
答案 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">