标签内的子列表格式文本为属性

时间:2017-08-18 08:54:08

标签: xml xslt-2.0

我想在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="&#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>

输出我得到了标签:

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

请建议我

先谢谢。

1 个答案:

答案 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="&#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>