0

我有以下 XML

<?xml version="1.0" encoding="UTF-8" ?>
<GovTalkMessage xsi:schemaLocation="http://www.govtalk.gov.uk/CM/envelope     http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd" xmlns="http://www.govtalk.gov.uk/CM/envelope" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns:gt="http://www.govtalk.gov.uk/schemas/govtalk/core" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <EnvelopeVersion>1.0</EnvelopeVersion>
  <Header>
      <MessageDetails>
          <Class>NumberSearch</Class>
          <Qualifier>response</Qualifier>
          <TransactionID>4c5cf4a9e1a44cbbbe800ad9ea9f06fd</TransactionID>
          <GatewayTimestamp>2012-09-27T18:34:19-00:00</GatewayTimestamp>
      </MessageDetails>
      <SenderDetails>
         <IDAuthentication>
             <SenderID>XMLGatewayTestUserID</SenderID>
                 <Authentication>
                     <Method>CHMD5</Method>
                     <Value></Value>
                 </Authentication>
         </IDAuthentication>
      </SenderDetails>
  </Header>
  <GovTalkDetails>
     <Keys/>
  </GovTalkDetails>
  <Body>
    <NumberSearch xmlns="http://xmlgw.companieshouse.gov.uk/v1-0/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema http://xmlgw.companieshouse.gov.uk/v1-0/schema/NumberSearch.xsd">
   <SearchRows>1</SearchRows>
   <CoSearchItem>
       <CompanyName>MILLENNIUM STADIUM PLC</CompanyName>
       <CompanyNumber>03176906</CompanyNumber>
       <DataSet>LIVE</DataSet>
       <CompanyIndexStatus></CompanyIndexStatus>
       <CompanyDate></CompanyDate>
   </CoSearchItem>
</NumberSearch>
</Body>
</GovTalkMessage>

我想使用 XSLT 将其翻译成以下内容;

<?xml version="1.0"?>
<CompanySearchResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <RegistrationNumber>03176906</RegistrationNumber>
    <RegisteredName>MILLENNIUM STADIUM PLC</RegisteredName>
</CompanySearchResult>

目前我有以下 XSLT 文件

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:ev="http://www.govtalk.gov.uk/CM/envelope"
            xmlns:gt="http://www.govtalk.gov.uk/schemas/govtalk/core"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:sr="http://xmlgw.companieshouse.gov.uk/v1-0/schema/NumberSearch.xsd">
<xsl:template match="/">
    <CompanySearchResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <RegistrationNumber>
            <xsl:value-of select="ev:GovTalkMessage/ev:Body/ev:NumberSearch/ev:CoSearchItem/ev:CompanyNumber"/>
        </RegistrationNumber>
        <RegisteredName>
            <xsl:value-of select="ev:GovTalkMessage/ev:Body/ev:NumberSearch/ev:CoSearchItem/ev:CompanyName"/>
        </RegisteredName>
    </CompanySearchResult>
    </xsl:template>
  </xsl:stylesheet>

但是我只是在 RegistrationNumber 和 RegistrationName 中得到一个空白 -

我需要改变什么才能正确获得这些。

提前致谢

4

1 回答 1

1

Since you haven't provided the rules by which this transformation should occur (e.g., are there ever more than one search row?), here's a short, rather unintelligently-produced XSLT that accomplishes what you ask.

When this XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://www.govtalk.gov.uk/CM/envelope"
  xmlns:t="http://xmlgw.companieshouse.gov.uk/v1-0/schema"
  exclude-result-prefixes="x t"
  version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
    <CompanySearchResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <RegistrationNumber>
        <xsl:value-of select="x:Body/*/*/t:CompanyNumber" />    
      </RegistrationNumber>
      <RegisteredName>
        <xsl:value-of select="x:Body/*/*/t:CompanyName" />      
      </RegisteredName>
    </CompanySearchResult>
  </xsl:template>

</xsl:stylesheet>

...is applied to the originally provided XML:

<?xml version="1.0" encoding="UTF-8"?>
<GovTalkMessage xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gt="http://www.govtalk.gov.uk/schemas/govtalk/core" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" xmlns="http://www.govtalk.gov.uk/CM/envelope" xsi:schemaLocation="http://www.govtalk.gov.uk/CM/envelope     http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd">
  <EnvelopeVersion>1.0</EnvelopeVersion>
  <Header>
    <MessageDetails>
      <Class>NumberSearch</Class>
      <Qualifier>response</Qualifier>
      <TransactionID>4c5cf4a9e1a44cbbbe800ad9ea9f06fd</TransactionID>
      <GatewayTimestamp>2012-09-27T18:34:19-00:00</GatewayTimestamp>
    </MessageDetails>
    <SenderDetails>
      <IDAuthentication>
        <SenderID>XMLGatewayTestUserID</SenderID>
        <Authentication>
          <Method>CHMD5</Method>
          <Value/>
        </Authentication>
      </IDAuthentication>
    </SenderDetails>
  </Header>
  <GovTalkDetails>
    <Keys/>
  </GovTalkDetails>
  <Body>
    <NumberSearch xmlns="http://xmlgw.companieshouse.gov.uk/v1-0/schema" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema http://xmlgw.companieshouse.gov.uk/v1-0/schema/NumberSearch.xsd">
      <SearchRows>1</SearchRows>
      <CoSearchItem>
        <CompanyName>MILLENNIUM STADIUM PLC</CompanyName>
        <CompanyNumber>03176906</CompanyNumber>
        <DataSet>LIVE</DataSet>
        <CompanyIndexStatus/>
        <CompanyDate/>
      </CoSearchItem>
    </NumberSearch>
  </Body>
</GovTalkMessage>

...the wanted result is produced:

<?xml version="1.0"?>
<CompanySearchResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <RegistrationNumber>03176906</RegistrationNumber>
    <RegisteredName>MILLENNIUM STADIUM PLC</RegisteredName>
</CompanySearchResult>

Note the correct usage of the two namespaces needed to make this transformation work. I believe yours fails because you only specify one namespace (which, for the <CompanyNumber> and the <CompanyName> elements, is the incorrect one).

于 2012-09-27T18:45:19.747 回答