相似类型的数据不匹配相同的案例

Similar type of data not matching the same case

我有以下XML

<?xml version="1.0" encoding="UTF-8"?>
<body>
<para><content-style font-style="bold">1/7 7.</content-style> This is First</para>
<para><content-style font-style="bold">1/8 8.</content-style> This is second<content-style format="superscript">6</content-style></para>
</body>

在这里,当我尝试使用我的 XSLT 应用模板时,虽然上面的两个段落格式相同,但第一个有效,第二个无效。

预期输出如下。

 <div class="para"><a name="P1-7"></a><span class="phrase">1/7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7. This is First
      </div>

      <div class="para"><a name="P1-8"></a><span class="phrase">1/8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8. This is second <span class="format-superscript">6</span>
      </div>

我得到的当前输出是

 <div class="para"><a name="P1-7"></a><span class="phrase">1/7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7. This is First
      </div>

      <para><span class="font-style-bold">1/8 8.</span> This is second<span class="format-superscript">6</span></para>

请告诉我哪里出错了以及如何解决。

下面是我的 XSL

<xsl:template match="para[content-style[matches(., '(\w+)/(\w+)')]][1]">
<div class="para">
                <xsl:choose>
                    <xsl:when test="contains(substring-after(substring-after(./content-style/text(),'/'),'/'),' ')">
                        <xsl:analyze-string select="substring-before(.,' ')" regex="(\w+)/(\w+)/(\w+)">
                            <xsl:matching-substring>
                                <a name="{concat('P',regex-group(1),'-',regex-group(2),'-',regex-group(3))}"/>
                                <span class="phrase">
                                    <xsl:value-of select="."/>
                                </span>
                            </xsl:matching-substring>
                            <xsl:non-matching-substring>
                                <xsl:analyze-string select="." regex="(\w+)/(\w+)">
                                    <xsl:matching-substring>
                                        <a name="{concat('P',regex-group(1),'-',regex-group(2))}"/>
                                        <span class="phrase">
                                            <xsl:value-of select="."/>
                                        </span>
                                        <xsl:text>&#160;&#160;&#160;&#160;&#160;</xsl:text>
                                    </xsl:matching-substring>
                                    <xsl:non-matching-substring>
                                        <xsl:value-of select="."/>
                                    </xsl:non-matching-substring>
                                </xsl:analyze-string>
                            </xsl:non-matching-substring>
                        </xsl:analyze-string>
                        <xsl:choose>
                            <xsl:when test="./@format">
                                <span class="format-{@format}">
                                    <xsl:value-of select="substring-after(.,' ')"/>
                                </span>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:variable name="fontStyle">
                                    <xsl:value-of select="concat('font-style-',@font-style)"/>
                                </xsl:variable>
                                <span class="{$fontStyle}">
                                    <xsl:value-of select="substring-after(.,' ')"/>
                                </span>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:analyze-string select="." regex="(\w+)/(\w+)/(\w+)">
                            <xsl:matching-substring>
                                <a name="{concat('P',regex-group(1),'-',regex-group(2),'-',regex-group(3))}"/>
                                <span class="phrase">
                                    <xsl:value-of select="."/>
                                </span>
                            </xsl:matching-substring>
                            <xsl:non-matching-substring>
                                <xsl:analyze-string select="." regex="(\w+)/(\w+)">
                                    <xsl:matching-substring>
                                        <a name="{concat('P',regex-group(1),'-',regex-group(2))}"/>
                                        <span class="phrase">
                                            <xsl:value-of select="."/>
                                        </span>
                                        <xsl:text>&#160;&#160;&#160;&#160;&#160;</xsl:text>
                                    </xsl:matching-substring>
                                    <xsl:non-matching-substring>
                                        <xsl:value-of select="."/>
                                    </xsl:non-matching-substring>
                                </xsl:analyze-string>
                            </xsl:non-matching-substring>
                        </xsl:analyze-string>
                    </xsl:otherwise>
                </xsl:choose>
            </div>
</xsl:template>

<xsl:template match="content-style">
        <xsl:apply-templates select="./node()[1][self::page]" mode="first"/>

                <xsl:choose>
                    <xsl:when test="./@format">
                        <span class="format-{@format}">
                            <xsl:apply-templates/>
                        </span>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:variable name="fontStyle">
                            <xsl:value-of select="concat('font-style-',@font-style)"/>
                        </xsl:variable>
                        <span class="{$fontStyle}">
                            <xsl:apply-templates/>
                        </span>
                    </xsl:otherwise>
                </xsl:choose>

    </xsl:template>

Working DEmo

谢谢

如果您不想要第一段,请不要请求。

para[content-style[matches(., '(\w+)/(\w+)')]][1]
                                               ^
                                               |
                                              here

删除量词并将其插入到另一个表达式中,如下所示:

contains(substring-after(substring-after(./content-style[1]/text(),'/'),'/'),' ')
                                                         ^
                                                         |
                                                        here