0

我有一个XSLT转变:

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

    <xsl:output method="xml"
                indent="yes"
                version="1.0"
                encoding="UTF-16"              
                standalone="yes"                        
                cdata-section-elements="title date referencenumber url company city state country postalcode description salary education jobtype category experience"/>

    <xsl:param name="currentDate"/>

    <xsl:template match="/response/result">
        <source>            
            <xsl:for-each select="//doc">
                <job>
                    <title>
                        <xsl:value-of select="str[@name='title']"/>
                    </title>
                    <date>
                        <xsl:value-of select="date[@name='ds_field_ad_publish']"/>
                    </date>
                    <referencenumber>
                        <xsl:value-of select="int[@name='nid']"/>
                    </referencenumber>
                </job>
            </xsl:for-each>            
        </source>
    </xsl:template>   

</xsl:stylesheet>

这是我的XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <int name="status">0</int>
        <int name="QTime">4</int>
        <lst name="params">
            <str name="wt">xml</str>
            <str name="fq">type:ad_vacancy is_organisation_nid:190908</str>
            <str name="rows">1000000</str>
        </lst>
    </lst>
    <result name="response" numFound="2" start="0">
        <doc>
            <!-- all my values -->
        </doc>
        <doc>
            <!-- all my values -->
        </doc>
        <doc>
            <!-- all my values -->
        </doc>
    </result>
</response>

我正在匹配/response/result然后循环遍历所有<doc>元素。一切正常,但在我的文档顶部,我看到了 element.xml 的值<lst>。像这样:

0
4

    xml
    type:ad_vacancy is_organisation_nid:190908
    1000000

我需要以某种方式逃离整个街区,我的转变与它不匹配。我尝试过不同的表达方式,例如:<xsl:template match="//response/result">, <xsl:template match="//response//result">. 我还尝试将其添加到我的转换中:

<xsl:template match="/*">
    <xsl:apply-templates/>
</xsl:template>

但这也没有帮助。来自的值<lst>仍然存在。有没有办法摆脱它们?

4

2 回答 2

2

您需要覆盖一些内置模板

<xsl:template match="text()"/>

或防止与

<xsl:template match="/">
  <xsl:apply-templates select="response/result"/>
</xsl:template>
于 2012-08-22T10:51:33.497 回答
1

只需将其添加到您的模板中:<xsl:template match="text() | @*"/> 它匹配文本节点和属性,并且由于模板为空,因此对它们没有任何作用。它实际上是一个“内置模板”--> http://www.w3.org/TR/xslt#built-in-rule

您编辑的 XSLT 如下所示:

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

<xsl:output method="xml"
    indent="yes"
    version="1.0"
    encoding="UTF-16"              
    standalone="yes"                        
    cdata-section-elements="title date referencenumber url company city state country postalcode description salary education jobtype category experience"/>

<xsl:param name="currentDate"/>

<xsl:template match="text() | @*"/>

<xsl:template match="/response/result">
    <source>            
        <xsl:for-each select="//doc">
            <job>
                <title>
                    <xsl:value-of select="str[@name='title']"/>
                </title>
                <date>
                    <xsl:value-of select="date[@name='ds_field_ad_publish']"/>
                </date>
                <referencenumber>
                    <xsl:value-of select="int[@name='nid']"/>
                </referencenumber>
            </job>
        </xsl:for-each>            
    </source>
</xsl:template>   

</xsl:stylesheet>
于 2012-08-22T10:50:22.340 回答