如果我有这个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工作吗?
答案 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。