Reputation: 832
I have the following 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>
And I want to use XSLT to translate it into the following;
<?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>
Currently I have the following XSLT file
<?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>
However I am just getting a blank in the RegistrationNumber and RegistrationName -
what do I need to change to get these correctly.
Thanks in advance
Upvotes: 0
Views: 430
Reputation: 3738
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).
Upvotes: 1