如何使用xsl:if选择正确的节点值

时间:2014-11-13 11:31:07

标签: html xml xslt xslt-1.0

我有2个不同的XML

1 XML

<address>
    <localityType>CityType</localityType>
    <locality>CityName</locality>
</address>

2 XML

<address>
    <localityType>TownType</localityType>
    <locality>TownName</locality>
</address>

我有一个XSLT样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/">
        <html>
            <head>
            <title>Address</title>
            </head>
            <body>
                <table border="1" cellpadding="2" cellspacing="0">
                    <tr>
                        <td>City</td>
                        <td>
                            <xsl:variable name="loc" select="//localityType" /> 
                            <xsl:if test="$loc = 'CityType'">
                                <xsl:value-of select="//locality" />
                            </xsl:if>
                        </td>
                    </tr>
                    <tr>
                        <td>Town</td>
                        <td>
                            <xsl:variable name="loc" select="//localityType" />
                            <xsl:if test="$loc != 'CityType'">
                                <xsl:value-of select="//locality" />
                            </xsl:if>
                        </td>
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

结果我想得到下表中的第一个XML enter image description here

作为第二个XML的结果 - 下表 enter image description here

我的问题是因为我的 xsl:if 语句,我没有得到这个表。也许我用错了

1 个答案:

答案 0 :(得分:1)

下面的样式表会生成相同的HTML输出,而不使用xsl:variable//轴。这些构造在XSLT中可用的事实并不意味着您应该在任何情况下使用它们。

何时使用xsl:variable

您应该使用变量

  • 不使用它意味着在几个地方重复一个冗长的表达
  • 在另一个上下文中存储您需要的任何上下文信息
  • 在转入下一步转换之前存储中间结果

您对xsl:variable的使用既不属于这两个类别:表达式很简单,元素localityType在上下文中很容易获得,而您以后不需要结果。

何时使用//(后代或自我::轴)

仅当您使用此表达式导航的结构静态已知时,才应使用//。在您的情况下,输入XML的结构并不完全深入并且事先已知。您的模板匹配适用于/,您知道localityType元素的完整路径:"address/localityType"

使用xsl:if是一个好主意。


<强>样式表

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/address">
        <html>
            <head>
            <title>Address</title>
            </head>
            <body>
                <table border="1" cellpadding="2" cellspacing="0">
                    <tr>
                        <td>City</td>
                        <td> 
                            <xsl:if test="localityType = 'CityType'">
                                <xsl:value-of select="locality"/>
                            </xsl:if>
                        </td>
                    </tr>
                    <tr>
                        <td>Town</td>
                        <td>
                            <xsl:if test="localityType = 'TownType'">
                                <xsl:value-of select="locality"/>
                            </xsl:if>
                        </td>
                    </tr>
                </table>
            </body>
        </html>
    </xsl:template>

</xsl:stylesheet>

假设以下输入XML:

<address>
    <localityType>CityType</localityType>
    <locality>CityName</locality>
</address>

HTML输出

<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <title>Address</title>
   </head>
   <body>
      <table border="1" cellpadding="2" cellspacing="0">
         <tr>
            <td>City</td>
            <td>CityName</td>
         </tr>
         <tr>
            <td>Town</td>
            <td></td>
         </tr>
      </table>
   </body>
</html>

呈现HTML

  

enter image description here