XSLT对字符串的顺序操作-如何正确执行?

时间:2019-07-17 13:12:15

标签: xslt

我有一个很好的大型xml文档,正在使用xsl进行转换。属性和文本都必须保留不变,除了一种特殊情况,我将其称为“ AZ”。

我想像这样转换字符串AZ:
1.删​​除第一个逗号之后的所有内容,包括逗号本身。
2.如果末尾有一个数字,请将其删除。 可以将数字包装在<sup></sup>中,并用</u></p>取代,并且这些元素之间可以有空格。这些可能会或可能不会被删除,但必须删除数字。

所有输出后来都用Java进行了转换,从而删除了AZ和其他文本的空格和HTML,因此AZ的输出是否具有HTML / spacing无关紧要。

======

我实际上已经解决了问题,但是...太乱了!如果还有更多条款,我可能需要对其进行编辑。

我现在正在使用XSL 1.0。
有什么写方法可以更容易地适应未来的变化吗?更一般,不在乎顺序吗?我能做些比这个怪物更好的事情吗?

<!--code that gets the variable $az goes here-->

<!--substring before comma-->
<xsl:variable name="az2">
    <xsl:choose>
        <xsl:when test="contains($az, ',')">
            <xsl:value-of select="normalize-space(substring-before($az, ','))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="normalize-space($az)"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- p check-->
<xsl:variable name="az3">
    <xsl:choose>
        <xsl:when test="substring($az2, string-length($az2)-3) = '&lt;/p&gt;'">
            <xsl:value-of select="normalize-space(substring($az2, 0, string-length($az2)-3))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$az2"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- u check-->
<xsl:variable name="az4">
    <xsl:choose>
        <xsl:when test="substring($az3, string-length($az3)-3) = '&lt;/u&gt;'">
            <xsl:value-of select="normalize-space(substring($az3, 0, string-length($az3)-3))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$az3"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- sup check-->
<xsl:variable name="az5">
   <xsl:choose>
        <xsl:when test="substring($az4, string-length($az4)-5, 6) = '&lt;/sup&gt;'">
            <xsl:value-of select="normalize-space(substring($az4, 0, string-length($az4)-5))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$az4"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<!-- digit check-->
<xsl:variable name="az6">
    <xsl:choose>
        <xsl:when test="number(substring($az5, string-length($az5))) = number(substring($az5, string-length($az5)))">
            <xsl:value-of select="normalize-space(substring($az5, 0, string-length($az5)))"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$az5"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:variable>

<el name="header" value="{$az6}"/>

AZ的一些可接受的转换:
herring-> herring
<p>header 1</p>-> <p>headerheader
(间距和HTML标记在输出中无关紧要,它们的几乎任何妥协都可以使用)
<p> <u>example</u><u> <sup>1 </sup> </u> , <u>examples <sup>1</sup></u></p> -> <p> <u>example</u><u> <sup>example

0 个答案:

没有答案