使用XSLT 1.0从xml中提取文本

时间:2017-09-18 14:47:25

标签: xml xslt

我有以下xml文件,它是元数据的一部分(我只提取了一部分)

<?xml version="1.0" encoding="UTF-8"?>
        <gmd:MD_Metadata xmlns:gmd="http://www.isotc211.org/2005/gmd" xmlns:gts="http://www.isotc211.org/2005/gts" xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gml="http://www.opengis.net/gml" xmlns:geonet="http://www.fao.org/geonetwork" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.isotc211.org/2005/gmd http://www.isotc211.org/2005/gmd/gmd.xsd http://www.isotc211.org/2005/srv http://schemas.opengis.net/iso/19139/20060504/srv/srv.xsd">
        <gmd:pointOfContact>
                    <gmd:CI_ResponsibleParty>
                       <gmd:individualName xsi:type="gmd:PT_FreeText_PropertyType">
                          <gco:CharacterString>Freddie Mercury</gco:CharacterString>
                          <gmd:PT_FreeText>
                             <gmd:textGroup>
                                <gmd:LocalisedCharacterString locale="#ITA">Pippo</gmd:LocalisedCharacterString>
                             </gmd:textGroup>
                          </gmd:PT_FreeText>
                       </gmd:individualName>
                       <gmd:organisationName xsi:type="gmd:PT_FreeText_PropertyType">
                          <gco:CharacterString>The Queen</gco:CharacterString>
                          <gmd:PT_FreeText>
                             <gmd:textGroup>
                                <gmd:LocalisedCharacterString locale="#ITA">Music Institute</gmd:LocalisedCharacterString>
                             </gmd:textGroup>                         
                          </gmd:PT_FreeText>
                       </gmd:organisationName>
                       <gmd:positionName xsi:type="gmd:PT_FreeText_PropertyType">
                          <gco:CharacterString>Singer</gco:CharacterString>                              
                       </gmd:positionName>
                       <gmd:contactInfo>
                          <gmd:CI_Contact>
                             <gmd:phone>
                                <gmd:CI_Telephone>
                                   <gmd:voice>
                                      <gco:CharacterString>123456789</gco:CharacterString>
                                   </gmd:voice>
                                   <gmd:facsimile>
                                      <gco:CharacterString>123456789</gco:CharacterString>
                                   </gmd:facsimile>
                                </gmd:CI_Telephone>
                             </gmd:phone>
                             <gmd:address>
                                <gmd:CI_Address>                                  
                                   <gmd:city>
                                      <gco:CharacterString>Zanzibar</gco:CharacterString>
                                   </gmd:city>                                   
                                   <gmd:postalCode>
                                      <gco:CharacterString>00001</gco:CharacterString>
                                   </gmd:postalCode>
                                   <gmd:country>
                                      <gco:CharacterString>India</gco:CharacterString>
                                   </gmd:country>
                                   <gmd:electronicMailAddress>
                                      <gco:CharacterString>info@test.org</gco:CharacterString>
                                   </gmd:electronicMailAddress>
                                </gmd:CI_Address>
                             </gmd:address>
                             <gmd:transferOptions>
                <gmd:MD_DigitalTransferOptions>
                   <gmd:onLine>
                      <gmd:CI_OnlineResource>
                         <gmd:linkage>
                            <gmd:URL>http://www.google.it</gmd:URL>
                         </gmd:linkage>  
                      </gmd:CI_OnlineResource>
                   </gmd:onLine>               
                </gmd:MD_DigitalTransferOptions>
             </gmd:transferOptions>
                         </gmd:CI_Contact>
                       </gmd:contactInfo>
                       <gmd:role>
                          <gmd:CI_RoleCode codeListValue="pointOfContact" codeList="http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_19139_Schemas/resources/Codelist/ML_gmxCodelists.xml#CI_RoleCode"/>
                       </gmd:role>
        </gmd:CI_ResponsibleParty>
        </gmd:pointOfContact>
    </gmd:MD_Metadata>

我想从这个文件中只提取两个信息: 1.文本Freddie Mercury(gco:CharacterString)

  1. 网址http://www.google.it(gmd:URL)
  2. 我开始尝试使用以下XSLT转换

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="text" encoding="UTF-8" />
    
    <gmd:MD_Metadata xmlns:gco="http://www.isotc211.org/2005/gco" xmlns:gmd="http://www.isotc211.org/2005/gmd" gco:isoType="gmd:MD_Metadata"> 
    
        <xsl:template match="//gmd:pointOfContact">
            <xsl:apply-templates select="gco:CharacterString" />
        </xsl:template>
    
        <xsl:template match="gco:CharacterString">
            <xsl:text>name=</xsl:text>          
        </xsl:template>
    </gmd:MD_Metadata>
    </xsl:stylesheet>
    

    但它不起作用。

    你能帮助我实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

我不知道您是否只想输出文本或创建新的xml文档,但是这个样式表会选择您想要的元素,我想:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"
xmlns:gmd="http://www.isotc211.org/2005/gmd" 
xmlns:gts="http://www.isotc211.org/2005/gts" 
xmlns:gco="http://www.isotc211.org/2005/gco" 
xmlns:gml="http://www.opengis.net/gml" 
xmlns:geonet="http://www.fao.org/geonetwork">

<!-- create new root element -->
<xsl:template match="/">
    <root>
        <xsl:apply-templates/>
    </root>
</xsl:template>

<!-- identity templates walks tree and suppresses nodes with no template -->
<xsl:template match="node()|@*">
        <xsl:apply-templates select="node()|@*"/>    
</xsl:template>

<!-- output only on nodes we select -->
<xsl:template match="node()|@*" mode="output">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" mode="output"/>
    </xsl:copy>
</xsl:template>    

<!-- match our two nodes and wrap in match tag. -->
<xsl:template match="gco:CharacterString[ancestor::gmd:individualName] | gmd:URL">
    <match>
        <xsl:apply-templates mode="output"/>
    </match>
</xsl:template>

</xsl:stylesheet>

这会创建输出

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:gmd="http://www.isotc211.org/2005/gmd"     xmlns:gts="http://www.isotc211.org/2005/gts"
xmlns:gco="http://www.isotc211.org/2005/gco"     xmlns:gml="http://www.opengis.net/gml"
xmlns:geonet="http://www.fao.org/geonetwork">
<match>Freddie Mercury</match>
<match>http://www.google.it</match>
</root>

如果您只想要文字输出,可以在xsl:method中指定。你的描述也说你只想输出Freddy Mercury; gmd:individualName在这种情况下是唯一的,但不确定您希望使用此文件的文件集上有哪种标记变体。

此文件只包含一个gmd:URL标记,同样不确定可能存在哪种变体,但这会根据您的问题获得输出