XSL1.0:在重复中选择特定元素
XSL1.0 : Selecting specific elements in repeating
有这样的XML:
<categories>
<request type="this request is B and O">
<list name="B"/>
<list name="O"/>
</request>
<request type="this request is N only">
<list name="N"/>
</request>
<request type="this request is O and E">
<list name="O"/>
<list name="E"/>
</request>
<request type="this request is O and G">
<list name="O"/>
<list name="G"/>
</request>
<request type="this request is N and E">
<list name="N"/>
<list name="E"/>
</request>
<request type="this request is E only">
<list name="E"/>
</request>
<request type="this request is B only">
<list name="B"/>
</request>
<request type="this request is B and N">
<list name="N"/>
<list name="B"/>
</request>
</categories>
我试过如下:
<xsl:template name="simplified">
<xsl:for-each select="categories/request[child::list/@name = 'B'] | categories/request[child::list/@name = 'O'] | categories/request[child::list/@name = 'N']">
<fo:block>
<xsl:value-of select="@type"/>
</fo:block>
</xsl:for-each>
</xsl:template>
规则是:
- 在所有请求之后重复,其中
类型的子项将仅具有名称 B、O 或 N;
- 如果一个
元素有一个@name为“B”的列表和一个@name为“O”或“N”的列表,则应重复添加;
- 如果一个
元素有一个带有@name“N”或“O”的列表,但前一个或下一个列表元素(在同一个 下)有@name“G”或“E” ",不应该重复添加。
现在我收到以下结果:
this request is B and O
this request is N only
this request is O and E
this request is O and G
this request is N and E
this request is B only
this request is B and N
我需要收到以下正确结果:
this request is B and O
this request is N only
this request is B only
this request is B and N
如何更新 xsl1.0 的重复模板?
我觉得很难理解你的描述。看来你想做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/categories">
<xsl:for-each select="request[not(list[contains('GE', @name)])]">
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
或者 - 如果您更喜欢白名单而不是黑名单:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/categories">
<xsl:for-each select="request[not(list[not(contains('BON', @name))])]">
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
有这样的XML:
<categories>
<request type="this request is B and O">
<list name="B"/>
<list name="O"/>
</request>
<request type="this request is N only">
<list name="N"/>
</request>
<request type="this request is O and E">
<list name="O"/>
<list name="E"/>
</request>
<request type="this request is O and G">
<list name="O"/>
<list name="G"/>
</request>
<request type="this request is N and E">
<list name="N"/>
<list name="E"/>
</request>
<request type="this request is E only">
<list name="E"/>
</request>
<request type="this request is B only">
<list name="B"/>
</request>
<request type="this request is B and N">
<list name="N"/>
<list name="B"/>
</request>
</categories>
我试过如下:
<xsl:template name="simplified">
<xsl:for-each select="categories/request[child::list/@name = 'B'] | categories/request[child::list/@name = 'O'] | categories/request[child::list/@name = 'N']">
<fo:block>
<xsl:value-of select="@type"/>
</fo:block>
</xsl:for-each>
</xsl:template>
规则是:
- 在所有请求之后重复,其中
- 类型的子项将仅具有名称 B、O 或 N;
- 如果一个
元素有一个@name为“B”的列表和一个@name为“O”或“N”的列表,则应重复添加; - 如果一个
元素有一个带有@name“N”或“O”的列表,但前一个或下一个列表元素(在同一个 下)有@name“G”或“E” ",不应该重复添加。
现在我收到以下结果:
this request is B and O
this request is N only
this request is O and E
this request is O and G
this request is N and E
this request is B only
this request is B and N
我需要收到以下正确结果:
this request is B and O
this request is N only
this request is B only
this request is B and N
如何更新 xsl1.0 的重复模板?
我觉得很难理解你的描述。看来你想做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/categories">
<xsl:for-each select="request[not(list[contains('GE', @name)])]">
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
或者 - 如果您更喜欢白名单而不是黑名单:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/categories">
<xsl:for-each select="request[not(list[not(contains('BON', @name))])]">
<xsl:value-of select="@type"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>