我有以下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中得到一个空白 -
我需要更改才能正确获取这些内容。
提前致谢
答案 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>
元素,它是不正确的名称空间。)