我想r根據其屬性值對元素進行分組:
- 如果當前
r元素和后續元素的屬性值相同,則所有元素都應包含在一個r元素中。 - 需要洗掉
r前面r具有相同屬性和值的所有元素。 - 如果存在相同元素的空序列,則只保留一個。
我面臨的問題是: - 最后洗掉它,r您可以參考突出顯示。3 與上面的合并
XML:
<text width="12240" height="15840" orient="">
<p style="pxpub">
<r/>
<r/>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"/>
<r/>
<r pub="first">1 </r>
<r pub="first">2some text</r>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"/>
<r pub="first"/>
<r/>
<r pub="a">1 some text</r>
<r pub="a"> 2 merge with above one</r>
<r pub="a"> 3 merge with above one</r>
<r pub="first"/>
<r pub="b"> 4 merge with above one</r>
<r pub="b"> 5 merge with above one</r>
<r pub="second"/>
</p>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:strip-space elements="*"/>
<xsl:output method="xhtml"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="r">
<xsl:variable name="selfattval" select="string-join(.//@*,'')"/>
<xsl:choose>
<xsl:when test="preceding-sibling::*[1][self::r[string-join(distinct-values(.//@*),'') = $selfattval]]/node()"/>
<xsl:when test="$selfattval = preceding-sibling::*[1][self::r]/string-join(distinct-values(.//@*),'')"/>
<xsl:otherwise>
<r>
<xsl:apply-templates select="@* | node()"/>
<xsl:apply-templates select="following-sibling::*[1][self::r[string-join(distinct-values(.//@*),'') = $selfattval]]/node()"/>
</r>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
電流輸出:
<text width="12240" height="15840" orient="">
<p style="pxpub">
<r></r>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"></r>
<r></r>
<r pub="first">1 2some text</r>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"></r>
<r></r>
<r pub="a">1 some text 2 merge with above one</r>
<r pub="first"></r>
<r pub="b"> 4 merge with above one 5 merge with above one</r>
<r pub="second"></r>
</p>
</text>
期望輸出:
<text width="12240" height="15840" orient="">
<p style="pxpub">
<r></r>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"></r>
<r></r>
<r pub="first">1 2some text</r>
</p>
<p type="itemlist" style="TRH2">
<r pub="first"></r>
<r></r>
<r pub="a">1 some text 2 merge with above one 3 merge with above one</r>
<r pub="first"></r>
<r pub="b"> 4 merge with above one 5 merge with above one</r>
<r pub="second"></r>
</p>
uj5u.com熱心網友回復:
這聽起來像是一個任務for-each-group group-adjacent:
<xsl:template match="*[r]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="r" group-adjacent="@*" composite="yes">
<xsl:copy>
<xsl:apply-templates select="@*, current-group()/node()"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
這是自 Saxon 9.8 和 Saxon JS 2 以來支持的 XSLT 3 但只要您只有使用的pub屬性
<xsl:template match="*[r]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:for-each-group select="r" group-adjacent="@*">
<xsl:copy>
<xsl:apply-templates select="@*, current-group()/node()"/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
應該在 XSLT 2 中做同樣的事情,或者如果您有多個屬性并且需要它們全部用于分組鍵,string-join例如group-adjacent="string-join(@*, '|')"它們在 XSLT 2 中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365384.html
