使用XSL将XML文件转换为HTML文件

时间:2016-03-21 06:50:22

标签: html xml parsing xslt

我的要求如下,  1.在网页中上传一个xml文件  2.使用xsl文件解析上传的xml  3.在同一网页的html表格中显示结果。

但是我无法使用我的xml文件进行解析。我尝试使用简单的xml文件,但它确实有用。 我的xml文件如下所示,

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<DCinemaSecurityMessage xmlns="http://www.smpte-ra.org/schemas/430-3/2006/ETM" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:enc="http://www.w3.org/2001/04/xmlenc#">
   <AuthenticatedPublic Id="ID_AuthenticatedPublic"> 
      <MessageId>urn:uuid:3963b8fc-e989-4be2-a5d4-139d8561643c</MessageId>
      <MessageType>http://www.smpte-ra.org/430-1/2006/KDM#kdm-key-type</MessageType>
      <AnnotationText>NBS</AnnotationText>
      <IssueDate>2016-02-25T17:43:29-00:00</IssueDate>
      <Signer>
         <ds:X509IssuerName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">dnQualifier=vV59D4u5w9rnFOyDPugA9tpTE7Y=,OU=.Signature.DC.CA.DVS,O=.DC.CA.DVS,CN=.ClipsterDCI.Signature </ds:X509IssuerName>
         <ds:X509SerialNumber xmlns:ds="http://www.w3.org/2000/09/xmldsig#">139130018</ds:X509SerialNumber>
      </Signer>
      <RequiredExtensions>
         <KDMRequiredExtensions xmlns="http://www.smpte-ra.org/schemas/430-1/2006/KDM">
            <Recipient><X509IssuerSerial><ds:X509IssuerName xmlns:ds="http://www.w3.org/2000/09/xmldsig#">dnQualifier=vUlg/0Tl/y5rXEFbSb7xF76F/2U=,CN=.DC.DOLPHIN.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</ds:X509IssuerName><ds:X509SerialNumber xmlns:ds="http://www.w3.org/2000/09/xmldsig#">25149</ds:X509SerialNumber></X509IssuerSerial><X509SubjectName>dnQualifier=ejcAIJ/TlzuipjwSFRTGhPT/8go=,CN=LE SPB MD SM.DCP2000-200007-03.DC.DC2.SMPTE,OU=DC.DOREMILABS.COM,O=DC2.SMPTE.DOREMILABS.COM</X509SubjectName>
           </Recipient>
           <CompositionPlaylistId>urn:uuid:16e5f6c6-89b5-4c0e-a01d-79dcdf792daa</CompositionPlaylistId>
           <ContentTitleText>American_Pastoral_FTR-3-Temp_S_EN-XX_OV_20_2K_LS_20160218_NBS_IOP_OV</ContentTitleText>
           <ContentKeysNotValidBefore>2016-02-25T20:00:00-00:00</ContentKeysNotValidBefore>
           <ContentKeysNotValidAfter>2016-02-25T21:00:00-00:00</ContentKeysNotValidAfter>
           <AuthorizedDeviceInfo>
               <DeviceListIdentifier>urn:uuid:6fb7b1ef-1086-49b7-9f98-02333006fdfa</DeviceListIdentifier>
               <DeviceList><CertificateThumbprint>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</CertificateThumbprint></DeviceList>
          </AuthorizedDeviceInfo>
          <KeyIdList><TypedKeyId><KeyType>MDIK</KeyType><KeyId>urn:uuid:ac20730a-7172-4f5e-9f90-f9b8aac31a90</KeyId></TypedKeyId><TypedKeyId><KeyType>MDAK</KeyType><KeyId>urn:uuid:d93306ef-b0f8-43cc-adfd-ac534cdf8412</KeyId></TypedKeyId></KeyIdList>
        </KDMRequiredExtensions>
   </RequiredExtensions><NonCriticalExtensions/>
   </AuthenticatedPublic>
   </DCinemaSecurityMessage>

我需要在此xml中显示 IssueDate,ContentTitleText,ContentKeysNotValidBefore,ContentKeysNotValidAfter,CompositionPlaylistId 内容。我使用[http://www.w3schools.com/xsl/xsl_client.asp][1]链接进行解析。但是我无法在同一页面上传xml文件。

任何人都可以帮我弄清问题是什么? XSL文件,

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:enc="http://www.w3.org/2001/04/xmlenc#" xmlns:kdm="http://www.smpte-ra.org/schemas/430-1/2006/KDM" >
    <xsl:template match="/">
    <html>
      <body>
         <h2>Parsed Data</h2>
         <table border="1">
           <tr bgcolor="#9acd32">
             <th>Title</th>
             <th>Created Date</th>
             <th>Valid from</th>
             <th>Valid to</th>
             <th>UUID</th>
          </tr>
          <tr>
             <td><xsl:value-of select="/DCinemaSecurityMessage/AuthenticatedPublic/RequiredExtensions/KDMRequiredExtensions/ContentTitleText" /></td>
             <td><xsl:value-of select="/DCinemaSecurityMessage/AuthenticatedPublic/IssueDate" /></td>
             <td><xsl:value-of select="/DCinemaSecurityMessage/AuthenticatedPublic/RequiredExtensions/KDMRequiredExtensions/ContentKeysNotValidBefore" /></td>
             <td><xsl:value-of select="/DCinemaSecurityMessage/AuthenticatedPublic/RequiredExtensions/KDMRequiredExtensions/ContentKeysNotValidAfter" /></td>
             <td><xsl:value-of select="/DCinemaSecurityMessage/AuthenticatedPublic/RequiredExtensions/KDMRequiredExtensions/CompositionPlaylistId" /></td>
         </tr>
        </table>
     </body>
    </html>
     </xsl:template>
     </xsl:stylesheet>

并且没有错误消息,但表中没有来自xml的值

1 个答案:

答案 0 :(得分:0)

这很可能是名称空间问题(like) 对于第一次测试,尝试从xml中删除默认命名空间xmlns="http://www.smpte-ra.org/schemas/430-3/2006/ETM"

如果这有效但不应该是最终解决方案,则需要在xslt xmlns:x="http://www.smpte-ra.org/schemas/430-3/2006/ETM"中添加带前缀的命名空间,并在xpaht中使用此前缀。

例如:

<td>
  <xsl:value-of 
      select="/x:DCinemaSecurityMessage/x:AuthenticatedPublic/x:IssueDate" />
</td>

更新:
请注意 KDMRequiredExtensions 还有一个默认命名空间(xmlns="http://www.smpte-ra.org/schemas/430-1/2006/KDM) 因此使用kdm:KDMRequiredExtensions

 <xsl:value-of 
            select="/x:DCinemaSecurityMessage
           /x:AuthenticatedPublic
           /x:RequiredExtensions
           /kdm:KDMRequiredExtensions
           /kdm:ContentTitleText" />

在评论中将doe更新为其他问题:
问:但我们怎样才能确定此命名空间可用于此元素?
  每个xml节点都可以拥有自己的(新)默认命名空间xmlns="/url/"。此命名空间用于此节点和任何子节点(但可以再次更改) 在您的示例中,ContentTitleText没有默认的命名空间声明,因此父级的声明仍然有效 在你的xslt中,你需要为每个命名空间创建一个带前缀的命名空间声明,而不是你必须使用这个前缀。