XSLT如何首先获取以下值

时间:2015-02-03 06:29:34

标签: xml xslt xslt-1.0

我是XSLT的新手。 我有这样的XML:

<root>
    <story>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <strongp>
            <color>Attention</color>
            SomeText
        </strongp>
        <p>
            Text of interest1
            <a id="1234-3457">here</a>
        </p>
        <p>Text</p>
        <p>Text</p>
        <h5>Header H5</h5>
        <strongp>
            <color>Attention</color>
            SomeText
        </strongp>
        <p>
            Text of interest2
            <a id="8909-3457">here</a>
        </p>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <inline/>
    </story>
</root>

这是xsl我用来将<strongp>转换为另一个复杂元素<remark>

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="strongp/color" />
    <xsl:template match="strongp[color][contains(.,'Attention')]">
        <remark>
            <remarkheader>
                <xsl:value-of select="normalize-space(.)"/>
            </remarkheader>
            <remarktext>
                <xsl:for-each select=".">
                    <xsl:value-of select="normalize-space(following-sibling::p[1])"/>
                 </xsl:for-each></remarktext>
        </remark>
    </xsl:template>
</xsl:stylesheet>

输出:

<root>
        <story>
            <p>Text</p>
            <p>Text</p>
            <p>Text</p>
            <remark>
                <remarkheader>Attention SomeText</remarkheader>
                <remarktext>Text of interest1 here</remarktext>
            </remark>
            <p>
                Text of interest
                <a id="1234-3457">here</a>
            </p>
            <p>Text</p>
            <p>Text</p>
            <h5>Header H5</h5>
            <remark>
                <remarkheader>Attention SomeText</remarkheader>
                <remarktext>Text of interest2 here</remarktext>
            </remark>
            <p>
                Text of interest
                <a id="8909-3457">here</a>
            </p>
            <p>Text</p>
            <p>Text</p>
            <p>Text</p>
            <p>Text</p>
            <inline/>
        </story>
    </root>

在输出中,我得到以下<p>的值。但我需要使用所有标记,子元素内的属性来获取第一个<p>的值。然后需要删除第一个<p>。如何获取该标记并删除结果中的第一个<p>? 结果需要:

<root>
    <story>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <remark>
            <remarkheader>Attention SomeText</remarkheader>
            <remarktext>Text of interest1 <a id="1234-3457">here</a></remarktext>
        </remark>   
        <p>Text</p>
        <p>Text</p>
        <h5>Header H5</h5>
        <remark>
            <remarkheader>Attention SomeText</remarkheader>
            <remarktext>Text of interest2 <a id="8909-3457">here</a></remarktext>
        </remark>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <p>Text</p>
        <inline/>
    </story>
</root>

1 个答案:

答案 0 :(得分:2)

您需要添加另一个模板,以跳过处理<p>后的<strongp>元素:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="strongp/color" />
<xsl:template match="p[preceding-sibling::*[1][self::strongp][color][contains(.,'Attention')]]"/>
<xsl:template match="strongp[color][contains(.,'Attention')]">
    <remark>
        <remarkheader>
            <xsl:value-of select="normalize-space(.)"/>
        </remarkheader>
        <remarktext>
            <xsl:apply-templates select="following-sibling::p[1]/node()"/>
        </remarktext>
    </remark>
</xsl:template>
</xsl:stylesheet>