XSLT 1.0的新手,我真的很难提取以下XML的值(使用XSLT1.0):
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<smallnote xmlns="http://soap.test.com/2005/ob">
<Id>1234</Id>
<Note>
<Id>4567</Id>
<sObject xsi:type="abc:Testcase" xmlns:abc="urn:soap.test.com">
<abc:Id>890</abc:Id>
<abc:Name>Some name</abc:Name>
</sObject>
</Note>
</smallnote>
</soapenv:Body>
</soapenv:Envelope>
所需的输出:
<?xml version="1.0" encoding="UTF-8"?>
<Id>1234</Id>
<NoteId>4567</NoteId>
<ObjType>Testcase</ObjType>
<ObjId>890</ObjId>
<ObjName>Some name</ObjName>
我该如何处理名称空间?我知道:
<xsl:value-of select="//*[local-name() = 'Id']" />
,但它似乎对我有多个ID字段不起作用。
首先删除命名空间是更好的方法吗?因为现在我很难在尝试提取值时选择正确的"路径"。
预先感谢
首先删除命名空间是更好的方法吗?
我理解您对简单性的渴望,但是即使它在开始处理名称空间的开始时看起来不那么困难,它在您看来也可能很困难。请记住,没有名字空间前缀的孩子继承xmlns=...
属性设置的默认名称空间。
让我们遍历:
-
soapenv:Envelope
具有显式名称空间soapenv
-
soapenv:Body
Too -
smallnote
为自己及其子女定义了一个默认的名称空间。 - 因此,所有
smallnote
的孩子都使用此命名空间,除了用abc
名称空间,Id
和Name
的明确定义的命名空间。
要从输出中排除命名空间,请使用 exclude-result-prefixes
属性带有名称空间前缀来摆脱。
所以代码看起来像这样:
(我添加了一个简单的根标签aNote
,以使输出构型XML用于一个 tst:smallnote
节点)
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tst="http://soap.test.com/2005/ob"
xmlns:abc="urn:soap.test.com"
exclude-result-prefixes="xsi xsd tst abc soapenv">
<xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/>
<xsl:template match="tst:smallnote">
<aNote>
<Id><xsl:value-of select="tst:Id" /></Id>
<NoteId><xsl:value-of select="tst:Note/tst:Id" /></NoteId>
<ObjType><xsl:value-of select="substring-after(tst:Note/tst:sObject/@xsi:type,':')" /></ObjType>
<ObjId><xsl:value-of select="tst:Note/tst:sObject/abc:Id" /></ObjId>
<ObjName><xsl:value-of select="tst:Note/tst:sObject/abc:Name" /></ObjName>
</aNote>
</xsl:template>
</xsl:stylesheet>
输出是:
<?xml version="1.0" encoding="UTF-8"?>
<aNote>
<Id>1234</Id>
<NoteId>4567</NoteId>
<ObjType>Testcase</ObjType>
<ObjId>890</ObjId>
<ObjName>Some name</ObjName>
</aNote>