XSLT XML问题。
我还有上一个问题的另一种变体。我必须输出每个部分的第一页和最后一页元素。如下所示。
非常感谢XSLT 1.0解决方案和XSLT 2.0解决方案。我提前感谢您的时间和帮助。
谢谢JJ。
输入:
<root>
<page number="1" section="Arsenal">Arsenal</page>
<page number="2" section="Arsenal">Arsenal</page>
<page number="3" section="Arsenal">Arsenal</page>
<page number="4" section="Arsenal">Arsenal</page>
<page number="5" section="Arsenal">Arsenal</page>
<page number="6" section="Arsenal">Arsenal</page>
<page number="7" section="Chelsea">Chelsea</page>
<page number="8" section="Chelsea">Chelsea</page>
<page number="9" section="Chelsea">Chelsea</page>
<page number="10" section="Chelsea">Chelsea</page>
<page number="11" section="Chelsea">Chelsea</page>
<page number="12" section="Chelsea">Chelsea</page>
<page number="13" section="ManUnited">ManUnited</page>
<page number="14" section="ManUnited">ManUnited</page>
<page number="15" section="ManUnited">ManUnited</page>
<page number="16" section="ManUnited">ManUnited</page>
<page number="17" section="ManUnited">ManUnited</page>
<page number="18" section="ManUnited">ManUnited</page>
<page number="19" section="ManCity">ManCity</page>
<page number="20" section="ManCity">ManCity</page>
<page number="21" section="ManCity">ManCity</page>
<page number="22" section="ManCity">ManCity</page>
<page number="23" section="ManCity">ManCity</page>
<page number="24" section="ManCity">ManCity</page>
<page number="25" section="Arsenal">Arsenal</page>
<page number="26" section="Arsenal">Arsenal</page>
<page number="27" section="Arsenal">Arsenal</page>
<page number="28" section="Arsenal">Arsenal</page>
<page number="29" section="Arsenal">Arsenal</page>
</root>
输出:
<root>
<page number="1" section="Arsenal">Arsenal</page>
<page number="6" section="Arsenal">Arsenal</page>
<page number="7" section="Chelsea">Chelsea</page>
<page number="12" section="Chelsea">Chelsea</page>
<page number="13" section="ManUnited">ManUnited</page>
<page number="18" section="ManUnited">ManUnited</page>
<page number="19" section="ManCity">ManCity</page>
<page number="24" section="ManCity">ManCity</page>
<page number="25" section="Arsenal">Arsenal</page>
<page number="29" section="Arsenal">Arsenal</page>
</root>
答案 0 :(得分:3)
一种适用于XSLT1.0和2.0的方法是让模板匹配页面元素,这些元素具有与 @section 相同的 @section 属性大多数前后兄弟姐妹
<xsl:template match="page
[@section = preceding-sibling::page[1]/@section]
[@section = following-sibling::page[1]/@section]" />
这是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="page[@section = preceding-sibling::page[1]/@section][@section = following-sibling::page[1]/@section]" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
当应用于输入XML时,输出以下内容
<root>
<page number="1" section="Arsenal">Arsenal</page>
<page number="6" section="Arsenal">Arsenal</page>
<page number="7" section="Chelsea">Chelsea</page>
<page number="12" section="Chelsea">Chelsea</page>
<page number="13" section="ManUnited">ManUnited</page>
<page number="18" section="ManUnited">ManUnited</page>
<page number="19" section="ManCity">ManCity</page>
<page number="24" section="ManCity">ManCity</page>
<page number="25" section="Arsenal">Arsenal</page>
<page number="29" section="Arsenal">Arsenal</page>
</root>
仅在XSLT2.0中,您可以将 xsl:for-each-group 与 group-adjacent 属性结合使用。
此XSLT也应生成相同的输出
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="root">
<xsl:for-each-group select="page" group-adjacent="@section">
<xsl:apply-templates select="current-group()[1]|current-group()[last()]"/>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>