XSL名称空间和嵌套的xsl:for-each

时间:2011-06-06 10:49:11

标签: xslt

我有XML以下,并希望迭代元素,因此我可以用以下格式显示它:

PIN 1<br/>
&nbsp;&nbsp;  XYZ<br/>
&nbsp;&nbsp;  HELLO<br/>

PIN 2<br/>
&nbsp;&nbsp;  ABC<br/>
&nbsp;&nbsp;  HI<br/>

XML:

<RootResponse xmlns:ip="urn:domain:tx:inPayment" xmlns:ipn="urn:domain:tx:Pin">
   <OutBoundMessage>
      <ip:InfoMessage>
        <ipn:Alert>PIN 1</ipn:Alert>
         <ipn:Code>
           <ip:CodeLabel>XYZ</ip:CodeLabel>
           <ip:CodeMessage>HELLO</ip:CodeMessage>
         </ipn:Code>
      </ip:InfoMessage>

      <ip:InfoMessage>
         <ipn:Code>
           <ipn:Alert>PIN 2</ipn:Alert>
           <ip:CodeLabel>ABC</ip:CodeLabel>
           <ip:CodeMessage>HI</ip:CodeMessage>
         </ipn:Code>
      </ip:InfoMessage>
  </OutBoundMessage>
</RootResponse>

我似乎无法找到解决方案。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我建议关注W3C schools XSLT tutorial,这应该可以为您解决这个相对简单的XSLT问题。

你是正确的,你必须注意名称空间,虽然这是非常简单的。只需确保您的XSLT定义了所需的命名空间,并相应地在XPath语句中为元素名称添加前缀。请参阅以下内容:

XML Namespaces and How They Affect XPath and XSLT

答案 1 :(得分:0)

您应该在XSLT中声明名称空间,然后在表达式中使用声明的前缀。

以下是如何使用模板(即“推送风格”)而非xsl:for-each(例如“拉式”)的示例。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ip="urn:domain:tx:inPayment"
xmlns:ipn="urn:domain:tx:Pin"
exclude-result-prefixes="ip ipn">
    <xsl:output indent="yes" />

    <xsl:template match="ipn:Alert">
        <xsl:text>&#xA;</xsl:text>
        <xsl:apply-templates />
        <br/>
    </xsl:template>

    <xsl:template match="ip:*[starts-with(local-name(),'Code')]">
        <xsl:text>&#xA;&#160;&#160;</xsl:text>
        <xsl:apply-templates/>
        <br/>
    </xsl:template>

</xsl:stylesheet>