2012-09-27 48 views
0

我有下面的XML问题转换XML使用XSLT

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

既然你没有提供的规则通过这种变换应该发生(例如,是否有过不止一个搜索行?),这里是一个简短的,而unintelligently生产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>元素,这是不正确的)。

+0

谢谢 - 做到了。我不知道是否会有多个条目 - 我尝试过的每个搜索都只能带回一个结果 - 即使是通配符也是如此,因此我假设它只返回一个结果。 –