xsl for-each语句的问题

时间:2012-10-25 14:59:13

标签: xml xslt

我在使用XSL语句时遇到了另一个问题。我试图添加一个条件,以便如果找到某个值,在这个实例'call'中,它的行为略有不同。我知道这是一件很简单的事情,我做错了但不知道是什么!

基本上在下面的代码中似乎返回了正确的布尔值,但是它继续并且仍然将调用成本措辞。类和URL位置都正确输出。

提前致谢!

XML

<rhs_options>
<title>RHS title</title>
<service>
    <option>call</option>
    <text>telephone number text</text>
    <telephone>telephone number</telephone>
    <link>telephone number link</link>
</service>
<service>
    <option>branch</option>
    <text>branch text</text>
    <telephone/>
    <link>branch link</link>
</service>
<service>
    <option>online</option>
    <text>online text</text>
    <telephone/>
    <link>online link</link>
</service>

XSL

<aside class="cta">
<h4><xsl:value-of select="/Properties/Data/Datum[@ID='ID1']/DCR[@Type='RHS_Options']/rhs_options/title"/></h4>
    <xsl:for-each select="/Properties/Data/Datum[@ID='ID1']/DCR[@Type='RHS_Options']/rhs_options/service">  
        <xsl:choose>
            <xsl:when test="/Properties/Data/Datum[@ID='ID1']/DCR[@Type='RHS_Options']/rhs_options/service/option='call'">
                <p class="{./option}">
                    <xsl:value-of select="./text"/>
                        <br/>
                    <xsl:value-of select="./telephone"/>
                        <br/>
                    <a href="{./link}">
                        Call charges
                    </a>
                </p>
            </xsl:when>
            <xsl:when test="/Properties/Data/Datum[@ID='ID1']/DCR[@Type='RHS_Options']/rhs_options/service/option='phone'or'online'">
                <p class="{./option}">
                    <a href="{./link}">
                        <xsl:value-of select="./text"/>
                    </a>
                </p>
            </xsl:when>
        </xsl:choose>   
    </xsl:for-each>

1 个答案:

答案 0 :(得分:1)

你想要

    <xsl:choose>
        <xsl:when test="option='call'">
            <p class="{option}">
                <xsl:value-of select="text"/>
                    <br/>
                <xsl:value-of select="telephone"/>
                    <br/>
                <a href="{link}">
                    Call charges
                </a>
            </p>
        </xsl:when>
        <xsl:when test="option='phone' or option = 'online'">
            <p class="{option}">
                <a href="{link}">
                    <xsl:value-of select="text"/>
                </a>
            </p>
        </xsl:when>
    </xsl:choose>

<强>解释

提供的代码的问题是使用了绝对 XPath表达式,但是必须使用 relative Xpath表达式。

当然,使用`xsl:for-each *和 not 来使用任何显式XSLT条件指令更好 。< / p>

以下是相同但更紧凑和可维护的代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
    <aside class="cta">
        <h4><xsl:value-of select="title"/></h4>
        <xsl:apply-templates/>
    </aside>
 </xsl:template>

 <xsl:template match="service[option='call']">
   <p class="{option}">
     <xsl:value-of select="text"/>
     <br/>
     <xsl:value-of select="telephone"/>
     <br/>
     <a href="{link}">
      Call charges
     </a>
   </p>
 </xsl:template>

 <xsl:template match="service">
   <p class="{option}">
     <a href="{link}">
       <xsl:value-of select="text"/>
     </a>
   </p>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<rhs_options>
    <title>RHS title</title>
    <service>
        <option>call</option>
        <text>telephone number text</text>
        <telephone>telephone number</telephone>
        <link>telephone number link</link>
    </service>
    <service>
        <option>branch</option>
        <text>branch text</text>
        <telephone/>
        <link>branch link</link>
    </service>
    <service>
        <option>online</option>
        <text>online text</text>
        <telephone/>
        <link>online link</link>
    </service>
</rhs_options>

产生了想要的结果:

<aside class="cta">
   <h4>RHS title</h4>RHS title<p class="call">telephone number text<br/>telephone number<br/>
      <a href="telephone number link">
      Call charges
     </a>
   </p>
   <p class="branch">
      <a href="branch link">branch text</a>
   </p>
   <p class="online">
      <a href="online link">online text</a>
   </p>
</aside>