【问题标题】:XSLT 1.0 namespace and value extractionXSLT 1.0 命名空间和值提取
【发布时间】:2018-02-17 08:20:36
【问题描述】:

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 字段的我。

首先删除命名空间是更好的方法吗?因为现在每当我尝试提取值时,我都很难选择正确的“路径”。

提前致谢

【问题讨论】:

  • 看看这是否有帮助:stackoverflow.com/questions/34758492/… -- P.S.你确定这是你想要的输出吗?没有根元素? -- PP.S.如果您有多个 id,则不要使用后代 // 轴;请改用显式路径。

标签: xml templates xslt-1.0


【解决方案1】:

首先删除命名空间是更好的方法吗?

我理解您对简单性的渴望,但即使一开始处理命名空间看起来很麻烦,如果没有您认为的那么困难的话。请记住,没有命名空间前缀的子节点会继承由 xmlns=... 属性设置的默认命名空间。

让我们来看看:

  • soapenv:Envelope 具有显式命名空间 soapenv
  • soapenv:Body也是
  • smallnote 为其自身及其子项定义了一个默认命名空间。
  • 所以smallnote 的所有子代都使用这个命名空间,除了那些用abc 命名空间、IdName 明确定义的子代。

要从输出中排除命名空间,请使用带有命名空间前缀的 exclude-result-prefixes 属性来删除。

所以代码可能如下所示:
(我添加了一个简单的根标记 aNote 以使输出格式良好的 XML 用于 one 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    相关资源
    最近更新 更多