XSLT基于choose的元素选择功能不生效问题求助
现有XML结构
<Document> <Row> <KEY>NIKE|JB|APPAREL|MENS</KEY> <Period>Nov-21</Period> </Row> <Row> <KEY>FASCINATE|JB|ACCESSORIES|LADIES</KEY> <Matches> <Row> <KEY>FASCINATE|JB|ACCESSORIES|LADIES</KEY> <Period>Nov-22</Period> </Row> </Matches> </Row> </Document>
需求
遍历Document下的所有Row节点:
- 如果当前
Row下存在Period节点,直接输出该Period - 如果当前
Row下不存在Period节点,输出其嵌套的Matches/Row/Period节点
最终输出每个Row只保留KEY和对应Period两个子节点。
原XSLT代码问题
你写的代码有3个核心错误:
- XPath路径错误:以
/开头的路径是从文档根节点开始的绝对路径,在xsl:for-each遍历Document/Row的上下文环境中,/Period、/Matches/Row/Period都是从根节点查找对应元素,文档根节点下只有Document元素,所以这两个路径永远返回空。你应该使用相对当前Row节点的相对路径,直接写Period、Matches/Row/Period即可。 - 空值判断逻辑错误:XSLT 1.0没有
null常量,$period = null的判断逻辑是把变量和名为null的节点做比较,永远返回假,所以你要取嵌套Period的分支永远不会触发。判断节点是否存在直接用test="Period"即可,节点存在则返回真,不存在返回假。 - 变量取值错误:你定义的
$period变量取的是绝对路径/Period,永远为空,后续判断完全没有意义,直接删除该变量即可。
修正后可正常运行的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://exampleincludednamespace.com/" exclude-result-prefixes="ns"> <xsl:output method="xml" omit-xml-declaration="yes" /> <xsl:template match="/"> <Document> <xsl:for-each select="/Document/Row"> <xsl:copy> <xsl:copy-of select="KEY" /> <xsl:choose> <xsl:when test="Period"> <xsl:copy-of select="Period" /> </xsl:when> <xsl:otherwise> <xsl:copy-of select="Matches/Row/Period" /> </xsl:otherwise> </xsl:choose> </xsl:copy> </xsl:for-each> </Document> </xsl:template> </xsl:stylesheet>
输出结果
运行修正后的代码将得到你期望的输出:
<Document> <Row> <KEY>NIKE|JB|APPAREL|MENS</KEY> <Period>Nov-21</Period> </Row> <Row> <KEY>FASCINATE|JB|ACCESSORIES|LADIES</KEY> <Period>Nov-22</Period> </Row> </Document>
内容的提问来源于stack exchange,提问作者Shawn de Wet
相关产品推荐
相关产品推荐

