如何使用命名空间处理XML?

时间:2014-06-23 12:24:56

标签: xml xslt xml-namespaces

如果我有这个xml:

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope>
<m:RgWsPublicFirmActRtUser>
      <m:firmActDescr>ΑΛΛΟ ΛΙΑΝΙΚΟ ΕΜΠΟΡΙΟ ΣΕ ΜΗ ΕΞΕΙΔΙΚΕΥΜΕΝΑ ΚΑΤΑΣΤΗΜΑΤΑ</m:firmActDescr>
      <m:firmActKind>2</m:firmActKind>
      <m:firmActKindDescr>ΔΕΥΤΕΡΕΥΟΥΣΑ</m:firmActKindDescr>
      <m:firmActCode>47191000</m:firmActCode>
   </m:RgWsPublicFirmActRtUser>

   <m:RgWsPublicFirmActRtUser>
      <m:firmActDescr>ΛΙΑΝΙΚΟ ΕΜΠΟΡΙΟ ΕΙΔΩΝ ΔΩΡΩΝ ΓΕΝΙΚΑ</m:firmActDescr>
      <m:firmActKind>2</m:firmActKind>
      <m:firmActKindDescr>ΔΕΥΤΕΡΕΥΟΥΣΑ</m:firmActKindDescr>
      <m:firmActCode>47191008</m:firmActCode>
   </m:RgWsPublicFirmActRtUser>
</env:Envelope>

我使用这个XSLT:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
  <h3>Δραστηριότητες</h3>
    <table border="1">
      <tr bgcolor="#9acd32">
        <th style="text-align:left">Δραστηριότητα</th>
        <th style="text-align:left">Αριθμός δραστηριότητας</th>
        <th style="text-align:left">Περιγραφή δραστηριότητας</th>
        <th style="text-align:left">Κωδικός δραστηριότητας</th>
      </tr>
      <xsl:for-each select="Envelope/RgWsPublicFirmActRtUser">
      <tr>
        <td><xsl:value-of select="firmActDescr"/></td>
        <td><xsl:value-of select="firmActKind"/></td>
        <td><xsl:value-of select="firmActKindDescr"/></td>
        <td><xsl:value-of select="firmActCode"/></td>
      </tr>
      </xsl:for-each>
    </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

一切正常,但是当我在输入XML中有一个命名空间时:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:m="http://gr/gsis/rgwspublic/RgWsPublic.wsdl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

而不是没有名称空间:

<env:Envelope> 

XSLT不起作用

我的问题是XML是从第三方收到的,我无法控制内容。我需要按原样处理它。也许我可以在内部服务器进程中替换大env:Envelope 和小 env:Envelope ,但无论如何我可以在不更改XML的情况下使XSLT工作吗?

1 个答案:

答案 0 :(得分:1)

要匹配XSLT中的命名空间元素,您必须在样式表中为相同的命名空间URI声明一个命名空间前缀,并在XPath表达式中使用该前缀:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
      xmlns:m="http://gr/gsis/rgwspublic/RgWsPublic.wsdl">

  <xsl:template match="/">
    <!-- ... -->
    <xsl:for-each select="env:Envelope/m:RgWsPublicFirmActRtUser">

m:命名空间URI取自您的评论)。名称空间URI不必是浏览器可以获取的真实URL,它们只被视为名称空间的唯一标识符。一些XML技术使用&#34; URN&#34;其名称空间的标识符(如urn:example:namespace)而不是http URL。