2

我正在尝试更改我的 XSLT,以便当我的 XML 中的超级标记包含特定单词时,不选择子标记。

在此示例中,我不希望在<para>超级标签<formalpara>包含单词“Galaxy”时显示子标签

提前致谢。

我的 XML

<formalpara>
Galaxy
<para>
<bridgehead>Galaxy Zoo</bridgehead>
    <sliceXML>Galaxy</sliceXML>
    The human eye is far better at identifying characteristics of galaxies 
    than any computer. So Galaxy Zoo has called for everyday citizens to 
    help in a massive identification project. Well over a hundred thousand 
    people have helped identify newly discovered galaxies. Now you can, too.
</para>
</formalpara>

我的 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sparql-results="http://www.w3.org/2005/sparql-results#" version="1.0">

<xsl:template match="/">
    <xsl:call-template name="results"/>
    <xsl:message>FROM simpleHMHTransform XSLT8</xsl:message>
</xsl:template>

<xsl:template name="results">
    <xsl:for-each select="//formalpara">
        <xsl:call-template name="formalpara"/>
    </xsl:for-each>
    <xsl:for-each select="//para">
        <xsl:call-template name="para"/>
    </xsl:for-each>
</xsl:template>

<xsl:template name="formalpara">
<div id="formalpara">
    <xsl:copy-of select="text()"/>
</div>
</xsl:template>

<xsl:template name="para">
<div id="para">
    <xsl:copy-of select="text()"/>
</div>
</xsl:template>

我当前的输出

<?xml version="1.0" encoding="UTF-8"?><div xmlns:sparql-results="http://www.w3.org/2005/sparql-results#" id="formalpara">
Galaxy

</div><div xmlns:sparql-results="http://www.w3.org/2005/sparql-results#" id="para">


    The human eye is far better at identifying characteristics of galaxies 
    than any computer. So Galaxy Zoo has called for everyday citizens to 
    help in a massive identification project. Well over a hundred thousand 
    people have helped identify newly discovered galaxies. Now you can, too.
</div>

我想要的输出

<?xml version="1.0" encoding="UTF-8"?><div xmlns:sparql-results="http://www.w3.org/2005/sparql-results#" id="formalpara">
 Galaxy
</div>
4

1 回答 1

2

你真的应该做xsl:apply-templates而不是调用命名模板。然后,您可以添加此模板:

<xsl:template match="formalpara[contains(text(),'Galaxy')]/para"/>

稍后我可以举一个完整的例子。


完整示例:

XML 输入

<formalpara>
    Galaxy
    <para>
        <bridgehead>Galaxy Zoo</bridgehead>
        <sliceXML>Galaxy</sliceXML>
        The human eye is far better at identifying characteristics of galaxies 
        than any computer. So Galaxy Zoo has called for everyday citizens to 
        help in a massive identification project. Well over a hundred thousand 
        people have helped identify newly discovered galaxies. Now you can, too.
    </para>
</formalpara>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:sparql-results="http://www.w3.org/2005/sparql-results#">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="formalpara">
        <div id="formalpara">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

    <xsl:template match="formalpara[contains(text(),'Galaxy')]/para"/>

    <xsl:template match="para">
        <div id="para">
            <xsl:apply-templates/>
        </div>
    </xsl:template>

</xsl:stylesheet>

XML 输出

<div xmlns:sparql-results="http://www.w3.org/2005/sparql-results#" id="formalpara">
    Galaxy
    </div>

注意:我还将 更改为contains()contains(text(),'Galaxy')因此它只查看作为 . 的直接子级的文本formalpara

于 2012-09-21T16:23:11.427 回答