0

我正在使用 xslt 来处理从 Web 服务返回的结果。我首先需要确定结果用于哪个 Web 服务。我知道标签 platformCore:record 具有属性“xsi:type="listRel:Contact 或“xsi:type="listEmp:Employee"。我正在尝试选择该属性存储的值,但冒号似乎当我尝试选择值时会引起一些问题。

这是我尝试过的,但无法正常工作。

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

<xsl:variable name="Type"><xsl:value-of select="//*[local-name()='searchResponse']//*[local-name()='searchResult']//*[local-name()='recordList']//*[local-name()='record']@xsi:type"/></xsl:variable>

<root>
<test><xsl:value-of select="$Type"/></test>
</root>
</xsl:template>
</xsl:stylesheet>

这是一个简单的示例

<?xml version="1.0" encoding="UTF-8"?>
<searchResponse:searchResponse xmlns="urn:messages_2012_2.platform.webservices.itsthesuite.com" 
                               xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
                               xmlns:searchResponse="urn:messages_2012_2.platform.webservices.itsthesuite.com"
                               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <platformCore:searchResult xmlns:platformCore="urn:core_2012_2.platform.webservices.itsthesuite.com">
    <platformCore:status isSuccess="true"/>
    <platformCore:totalRecords>1</platformCore:totalRecords>
    <platformCore:recordList>
      <platformCore:record internalId="154098" xsi:type="listRel:Contact" xmlns:listRel="urn:relationships_2012_2.lists.webservices.itsthesuite.com">
        <listRel:entityId>John Smith</listRel:entityId>
        <listRel:firstName>John</listRel:firstName>
        <listRel:lastName>Smith</listRel:lastName>
        <listRel:phone>(777) 777-7777</listRel:phone>
        <listRel:email>john.smith@yormoms.com</listRel:email>
      </platformCore:record>
    </platformCore:recordList>
  </platformCore:searchResult>
</searchResponse:searchResponse>

我也需要适用于此示例的解决方案。

员工样本

        <?xml version="1.0" encoding="UTF-8"?>
<searchResponse xmlns="urn:messages_2012_2.platform.webservices.netsuite.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:searchResponse="urn:messages_2012_2.platform.webservices.netsuite.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<platformCore:searchResult xmlns:platformCore="urn:core_2012_2.platform.webservices.netsuite.com" >
<platformCore:status isSuccess="true"/>
<platformCore:totalRecords>1</platformCore:totalRecords>
<platformCore:recordList>
<platformCore:record internalId="158778" xsi:type="listEmp:Employee" xmlns:listEmp="urn:employees_2012_2.lists.webservices.netsuite.com">
<listEmp:entityId>331sfds Dipo  Chaponda</listEmp:entityId>
<listEmp:salutation>Mr.</listEmp:salutation>
<listEmp:firstName>Dipo</listEmp:firstName>
<listEmp:lastName>Chaponda</listEmp:lastName>
<listEmp:email>dchapond@youmm.com</listEmp:email>
</platformCore:record>
</platformCore:recordList>
</platformCore:searchResult>
</searchResponse>
4

1 回答 1

2

您可以使用本地名称选择属性,类似于您已经在做的事情,但通过在 * 前面加上 @:

@*[local-name() = 'type']

但是,用双斜杠乱扔您的 XPathlocal-name() =并不是一个好习惯。您应该正确使用命名空间,并在已知路径时使用精确路径,尽管这似乎不是您案例中元素的选项,因为它们在两个示例中使用不同的命名空间。这应该有效:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                exclude-result-prefixes="sr pc xsi"
                >

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="/">

    <xsl:variable name="Type">
      <xsl:value-of select="*[local-name() = 'searchResponse']/
                            *[local-name() = 'searchResult']/
                            *[local-name() = 'recordList']/
                            *[local-name() = 'record']/
                            @xsi:type"/>
    </xsl:variable>

    <root>
      <test>
        <xsl:value-of select="$Type"/>
      </test>
    </root>
  </xsl:template>
</xsl:stylesheet>

在您的示例输入上运行时,这会产生预期的结果:

<root>
  <test>listRel:Contact</test>
</root>
于 2013-03-19T02:23:37.240 回答