Sublist format text inside label as attributes

三世轮回 提交于 2019-12-12 04:06:47

问题


I want to add the label inside para as attribute value:

My source 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="&#x2022;">
            <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>

output i am getting para inside labels:

<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>

but needed output as like para inside label values like 'A. or (A) or A) or a) or (a) or a. or i) or (i) or i.' have to be removed and add as item tag attribute num value as shown below :

<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>

Please suggest me

Thanks in Advance.


回答1:


<?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="&#x2022;">
            <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>


来源:https://stackoverflow.com/questions/45752523/sublist-format-text-inside-label-as-attributes

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!