как различать случаи

У меня есть две строки XML ниже

 <para>
<content-style font-style="bold">abcdefg</content-style> This is out of content-style</para>
<para>
This is out of <content-style font-style="bold">abcdefg</content-style> content-style</para>

здесь, в первой строке XML, para имеет дочерний элемент как content-style, и между ним ничего нет, во втором XML есть некоторый текст (или может быть даже несколько узлов) между para и content-style, я просто хочу знать, как чтобы различать эти два случая с помощью XSLT.

Спасибо.


person user2423959    schedule 09.06.2014    source источник


Ответы (1)


используя следующий входной XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <para>
        <content-style font-style="bold">abcdefg</content-style> This is out of content-style</para>
    <para> This is out of <content-style font-style="bold">abcdefg</content-style>
        content-style</para>
</root>

попробуйте следующую таблицу стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:strip-space elements="*"/>

    <xsl:output indent="yes"/>

    <xsl:template match="/">
        <root>
            <this_case><xsl:copy-of select="root/para[node()[1][name()='content-style']]"/></this_case>
            <other_case><xsl:copy-of select="root/para[node()[1][name()!='content-style']]"/></other_case>
        </root>
    </xsl:template>

</xsl:stylesheet>

выражение root/para[node()[1][name()='content-style']] указывает на элемент root с дочерним элементом para, первый узел которого имеет имя content-style. Второй как раз наоборот.

Поскольку жесткие возвраты считаются текстовыми узлами, необходимо использовать <xsl:strip-space elements="*"/>.

person Joel M. Lamsen    schedule 09.06.2014
comment
привет @Joel, спасибо за ответ, я просто хочу знать, могу ли я использовать apply-templates напрямую, то есть <xsl:apply-templates sekect="root/para[node()[1][name()='content-style']]"/>, спасибо. - person user2423959; 09.06.2014