问题描述
我正在使用“xsl:for-each”来迭代每个元素,其名称内容和属性包含文本“句点”。当每次“xsl:for-each”迭代尝试取出一个日期时,它返回 2 个值。
文本“句号”的匹配必须这样进行,因为输入的数据可能会发生变化,并且不知道有多少id包含“句号”的元素会出现在数据中。
我想在“xsl:for-each”语法中保留 xpath 搜索条件,因为我使用模板来指出根。
当我尝试使用 date[1]
对日期进行子集化时,它仍然返回两个日期。
与上面小提琴相同的代码:
数据:
<?xml version="1.0" encoding="utf-8" ?>
<section>
<content id="period1">
<date>2021-01-01</date>
</content>
<content id="period2">
<date>2020-01-01</date>
</content>
</section>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#all"
>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/section">
<xsl:for-each select="//content/@*[contains(.,'period')]">
<date>
<!--<xsl:value-of select="."/>-->
<!--<xsl:value-of select="//date[1]"/>-->
<xsl:value-of select="//content/date"/>
</date>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
结果:
<!DOCTYPE HTML>
<date>2021-01-01 2020-01-01</date>
<date>2021-01-01 2020-01-01</date>
想要的结果:
<!DOCTYPE HTML>
<date>2021-01-01</date>
<date>2020-01-01</date>
解决方法
使用相对路径
<xsl:for-each select="content[@*[contains(.,'period')]]">
<date>
<!--<xsl:value-of select="."/>-->
<!--<xsl:value-of select="//date[1]"/>-->
<xsl:value-of select="date"/>
</date>
</xsl:for-each>