2016-02-19 175 views
0

試圖弄清爲什麼這不起作用。我遵循W3Schools XSLT Docs以及W3Schools XPath Docs上的說明,並且我一直對「MeterInfo」標籤的「MeterNo」值爲空。任何幫助將不勝感激。使用XSLT將Transfrom轉換爲XML

XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       exclude-result-prefixes="msxsl"> 

<xsl:template match="/"> 
    <MeterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <MeterNo> 
     <xsl:value-of select="Template[@name='MyTemplateName']/Field[@name='MyFieldName']"/> 
    </MeterNo> 
    </MeterInfo> 
</xsl:template> 

XML

<?xml version="1.0" encoding="utf-8"?> 
<ProcessHostRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns="http://www.utilitysolutions.cgi.com/UHIB-1_0"> 
    <DataArea> 
     <Process xmlns="http://www.openapplications.org/oagis" /> 
     <HostRequest> 
     <Template name="MyTemplateName"> 
      <Field name="MyFieldName"> 
       8768565 
      </Field> 
     </Template> 
     </HostRequest> 
    </DataArea> 
</ProcessHostRequest> 

我的轉型響應

<?xml version="1.0" encoding="UTF-8"?> 
<MeterInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <MeterNo/> 
</MeterInfo> 

回答

1

兩個錯誤:

首先在你的模板與匹配模式/上下文節點是根節點。 如果文檔節點的名稱爲Template,但是它的值爲ProcessHostRequest,則表達式select="Template[..."只會返回非空結果。

因此,匹配的後裔:select="//Template...

第二個TemplateField元素位於命名空間http://www.utilitysolutions.cgi.com/UHIB-1_0。要選擇他們,你需要聲明同一個命名空間中的XSLT:

<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
      xmlns:c="http://www.utilitysolutions.cgi.com/UHIB-1_0" 
      exclude-result-prefixes="msxsl c"> 

,並用它相應

<xsl:value-of select="//c:Template[@name='MyTemplateName']/c:Field[@name='MyFieldName']"/>