我有一个从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=""53"">
<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=""49"">
<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=""53"">
<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处理命名空间?
答案 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。