我想在para中添加标签作为属性值:
我的来源xml:
<body>
<p>blahblah</p>
<ul outputclass="l1">
<li outputclass="lt1">(a) blahblah</li>
<li outputclass="lt1">(b) blahblah</li>
<li outputclass="lt1">(c) blahblah
<ul outputclass="l2">
<li outputclass="lt2"> (1) blahblah</li>
<li outputclass="lt2"> (2) blahblah<fn><p>blah</p></fn></li>
<li outputclass="lt2"> (3) blahblah
<ul outputclass="l3">
<li outputclass="lt3"> (i) blahblah<fn><p>blah</p></fn></li>
<li outputclass="lt3"> (ii) blahblah</li>
<li outputclass="lt3"> (iii) blahblah</li>
</ul></li>
</ul></li>
<li outputclass="lt1">(d) blahblah</li>
<li outputclass="lt1">(e) blahblah</li>
</ul>
<p>blahblah</p>
</body>
myxslt
<?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:template match="@* | node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<para>
<xsl:apply-templates/>
</para>
</xsl:template>
<xsl:template match="ul[@outputclass='l1'] | ul[@outputclass='l2'] | ul[@outputclass='l3']">
<itemizedlist type="•">
<xsl:apply-templates/>
</itemizedlist>
</xsl:template>
<xsl:template match="li[@outputclass='lt1'] | li[@outputclass='lt2'] | li[@outputclass='lt3']">
<item>
<xsl:for-each-group select="node()" group-adjacent="boolean(self::ul)">
<xsl:choose>
<xsl:when test="current-grouping-key()">
<xsl:apply-templates select="current-group()"/>
</xsl:when>
<xsl:otherwise>
<para>
<xsl:apply-templates select="current-group()" mode="preserve"/>
</para>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</item>
</xsl:template>
</xsl:stylesheet>
输出我得到了标签:
<body>
<para>blahblah</para>
<itemizedlist type="normal">
<item><para>(a) blahblah</para></item>
<item><para>(b) blahblah</para></item>
<item><para>(c) blahblah</para>
<itemizedlist type="normal">
<item><para> (1) blahblah</para></item>
<item><para> (2) blahblah</para></item>
<item><para> (3) blahblah<footnote><para>blah</para></footnote></para>
<itemizedlist type="normal">
<item><para> (i) blahblah<footnote><para>blah</para></footnote></para></item>
<item><para> (ii) blahblah</para></item>
<item><para> (iii) blahblah</para></item>
</itemizedlist></item>
</itemizedlist></item>
<item><para>(d) blahblah</para></item>
<item><para>(e) blahblah</para></item>
</itemizedlist>
<para>blahblah</para>
</body>
但需要输出像标签值中的para一样,如&#39; A.或(A)或A)或a)或(a)或a。或i)或(i)或i。&#39;必须删除并添加为项目标记属性num值,如下所示:
<body>
<para>blahblah</para>
<itemizedlist type="normal">
<item num="(a)"><para>blahblah</para></item>
<item num="(b)"><para>blahblah</para></item>
<item num="(c)"><para>blahblah</para>
<itemizedlist type="normal">
<item num="(1)"><para>blahblah</para></item>
<item num="(2)"><para>blahblah</para></item>
<item num="(3)"><para>blahblah<footnote><para>blah</para></footnote></para>
<itemizedlist type="normal">
<item num="(i)"><para>blahblah<footnote><para>blah</para></footnote></para></item>
<item num="(ii)"><para>blahblah</para></item>
<item num="(iii)"><para>blahblah</para></item>
</itemizedlist></item>
</itemizedlist></item>
<item num="(d)"><para>blahblah</para></item>
<item num="(e)"><para>blahblah</para></item>
</itemizedlist>
<para>blahblah</para>
</body>
请建议我
先谢谢。
答案 0 :(得分:0)
<?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:template match="@* | node()" mode="#all">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="#current"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<para>
<xsl:apply-templates/>
</para>
</xsl:template>
<xsl:template match="ul[@outputclass='l1'] | ul[@outputclass='l2'] | ul[@outputclass='l3']">
<itemizedlist type="•">
<xsl:apply-templates/>
</itemizedlist>
</xsl:template>
<xsl:template match="li[@outputclass='lt1'] | li[@outputclass='lt2'] | li[@outputclass='lt3']">
<item>
<xsl:for-each-group select="node()" group-adjacent="if(self::text()) then('text') else(generate-id())">
<xsl:choose>
<xsl:when test="self::ul">
<xsl:apply-templates select="current-group()"/>
</xsl:when>
<xsl:when test="current-grouping-key() = 'text' and position() = 1">
<xsl:attribute name="num" select="tokenize(normalize-space(current-group()), ' ')[1]"/>
<para>
<xsl:value-of select="string-join(tokenize(normalize-space(current-group()), ' ')[position() > 1], ' ')"/>
</para>
</xsl:when>
<xsl:otherwise>
<para>
<xsl:apply-templates select="current-group()" mode="preserve"/>
</para>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</item>
</xsl:template>
</xsl:stylesheet>