xml转换带名称空间的XSLT

时间:2018-01-18 11:44:58

标签: xml xslt

我有一个从SharePoint生成的xml,我需要提取一些数据并生成一个简化的xml

这是我的原始(简化)源文件

<?xml version="1.0" encoding="utf-8"?>
<feed xml:base="http://itkm.gamesacorp.com/applications/_api/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
    <id>f8a19240-e319-454a-b4a6-fab8e3470c8d</id>
    <title />
    <updated>2018-01-17T15:13:15Z</updated>
    <entry m:etag="&quot;53&quot;">
        <id>Web/Lists(guid'fe244c05-99f9-4b69-8727-46327122b245')/Items(1)</id>
        <content type="application/xml">
            <m:properties>
                <d:Codigo>0002</d:Codigo>
                <d:App_x0020_name>GOT</d:App_x0020_name>
            </m:properties>
        </content>
    </entry>
    <entry m:etag="&quot;49&quot;">
        <id>Web/Lists(guid'fe244c05-99f9-4b69-8727-46327122b245')/Items(3)</id>
        <content type="application/xml">
            <m:properties>
                <d:Codigo>0006</d:Codigo>
                <d:App_x0020_name>ALTAIR</d:App_x0020_name>
            </m:properties>
        </content>
    </entry>
</feed>

这是我的xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>

<xsl:template match="feed">
  <Applications>
      <xsl:for-each select="entry">
         <App>
             <Code><xsl:value-of select="content/properties/Codigo"/></Code>
             <Name><xsl:value-of select="content/properties/App_x0020_name"/></Name>
             <Uri><xsl:value-of select="id"/></Uri>
        </App>
      </xsl:for-each>
  </Applications>
</xsl:template>
</xsl:stylesheet>

如果我在xml和xslt中省略了名称空间,结果就像预期的那样,但是我需要xlst使用命名空间,但我不知道xslt中包含哪些命名空间(以及如何)

这是修改后的xml,对我有用,请注意我删除了对命名空间的所有引用:

<?xml version="1.0" encoding="utf-8"?>
<feed>
    <id>f8a19240-e319-454a-b4a6-fab8e3470c8d</id>
    <title />
    <updated>2018-01-17T15:13:15Z</updated>
    <entry etag="&quot;53&quot;">
        <id>Web/Lists(guid'fe244c05-99f9-4b69-8727-46327122b245')/Items(1)</id>
        <content type="application/xml">
            <m:properties>
                <Codigo>0002</Codigo>
                <App_x0020_name>GOT</App_x0020_name>
            </m:properties>
        </content>
    </entry>
</feed>

如何使用xslt处理命名空间?

1 个答案:

答案 0 :(得分:1)

您需要在XSLT中声明名称空间,然后在xpath表达式中的所有元素名称中使用相关的名称空间前缀

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:a="http://www.w3.org/2005/Atom" 
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
    version="1.0"
    exclude-result-prefixes="a d m">
<xsl:output encoding="UTF-8" indent="yes" method="xml" omit-xml-declaration="no"/>

<xsl:template match="a:feed">
  <Applications>
      <xsl:for-each select="a:entry">
         <App>
             <Code><xsl:value-of select="a:content/m:properties/d:Codigo"/></Code>
             <Name><xsl:value-of select="a:content/m:properties/d:App_x0020_name"/></Name>
             <Uri><xsl:value-of select="a:id"/></Uri>
        </App>
      </xsl:for-each>
  </Applications>
</xsl:template>
</xsl:stylesheet>

请注意,在您的XML中,您有一个默认命名空间(没有前缀),但在XSLT中,我已将其指定为a的前缀,以便可以在xpath表达式中使用它。前缀使用根本不需要匹配XML。必须匹配的名称空间URI。