使用XSLT转换XML的问题

时间:2012-09-27 17:46:59

标签: xml xslt

我有以下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中得到一个空白 -

我需要更改才能正确获取这些内容。

提前致谢

1 个答案:

答案 0 :(得分:1)

既然你没有提供应该发生这种转换的规则(例如,是否有不止一个搜索行?),这里是一个简短而非智能生成的XSLT,可以完成你的要求。

当这个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>

...适用于最初提供的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>

...生成了想要的结果:

<?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>

请注意使此转换工作所需的两个命名空间的正确用法。我相信你的失败是因为你只指定了一个名称空间(对于<CompanyNumber><CompanyName>元素,它是不正确的名称空间。)