<xsl:if>如何处理像“<test>”这样的标签?</test> </xsl:if>

时间:2010-09-15 08:20:37

标签: xslt

我对XSL很新,我遇到了一些问题。

我使用的XML有一些标签,如<Example/>

在我的XSL中(输出是HTML)我对没有数据的标签使用了类似的东西:

<xsl:if test="count(ContractNr) > 0">  
  <td>Nr:</td>  
  <td><xsl:value-of select="ContractNr"/></td>  
</xsl:if>

没有标签时效果很好。

但如何为<xsl:if>之类的内容制作<ContractNumber/>? Ty,对不起我的英语。

更新:编辑了我的帖子,抱歉..我的意思是我的示例在xml中不存在我测试的标签时有效,但我如何测试标签是否为空“喜欢或

是的,Treemonkey,但我不确定这是否是我正在寻找的解决方案。

我会尝试更好地解释。

在xml输入文件中有许多标签是“可选”或“minOccurs =”0“”(根据模式)。使用xsl我尝试用表格创建一个html输出,我使用<xsl:if>来确定标签是否存在于xml中(没有标签=没有列)。

我给我的html表列提供静态名称(xml中的数据不能用于命名)并将数据从xml中放入。现在,当标记为<smthng/>时,我仍然会获得具有给定静态名称的列 - 这就是问题所在。我想制作一个xsl:if,这样如果有一个<smthng/>该列没有制作:

<table>
  <tr><xsl:if ...>
    <td>Some name:</td>
    <td><xsl:value-of select="smthng"/></td></xsl:if>
  </tr>
</table>

5 个答案:

答案 0 :(得分:1)

<xsl:if test="count(ContractNr) &gt; 0">
  <td>Nr:</td>
  <td><xsl:value-of select="ContractNr"/></td>
</xsl:if>

错误 XSLT

更好地使用

<xsl:apply-templates select="ContractNr[1]"/>

并拥有单独的模板

<xsl:template match="ContractNr/text()">
 <td>Nr:</td>
 <td><xsl:value-of select="."/></td>
</xsl:template>

需要学习的课程:XSLT模式匹配使得大量条件逻辑成为其他编程语言的“典型”。

答案 1 :(得分:0)

<ContractNumber></ContractNumber><ContractNumber/>不相同吗?

请参阅XML参考:http://www.w3.org/TR/xml/#sec-starttags

答案 2 :(得分:0)

我编辑了我的1个帖子,抱歉..我的意思是我的<xsl:if>示例在xml中不存在我测试的标签时有效,但我如何测试标签是否为“空”如{ {1}}或<smthng/>

是的,Treemonkey,但我不确定这是否是我正在寻找的解决方案。

我会尝试更好地解释。

在xml输入文件中有许多标签是“可选”或“minOccurs =”0“”(根据模式)。 使用xsl我尝试用表格创建一个html输出,我使用<smthng></smthng>来确定标签是否存在于xml中(没有标签=没有列)。
我给我的html表列提供静态名称(xml中的数据不能用于命名)并将数据从xml中放入。现在,当标记为<xsl:if>时,我仍然会获得具有给定静态名称的列 - 这就是问题所在。 我想创建一个xsl:如果是这样的话,如果有一个<smthng/>,则不会创建该列:
<smthng/>

答案 3 :(得分:0)

这是你想要的吗? 这将检查元素,然后允许您使用local-name()函数

来使用节点的名称

这也回答你的第二个问题,使用节点的应用模板只会将模板应用于匹配的元素,所以如果没有匹配就会自然地和IF一样自然地工作!

<xsl:template match="/">
<xsl:apply-templates select="ContractNumber"/>
</xsl:template>

<xsl:template match="ContractNumber">
<div>
<xsl:value-of select="local-name()"/>
</div>
</xsl:template>

您可以使用以下

<xsl:if test="ContractNumber=''"> do stuff </xsl:if>

<xsl:choose>
<xsl:when test="ContractNumber=''">
   <!--do nothing-->
</xsl:when>
<xsl:otherwise>
   <!--build table -->
</xsl:otherwise>
</xsl:choose>

答案 4 :(得分:0)

我认为这就是你想要的两种解决方案。

使用此输入:

<table>
   <row>
      <a>A1</a>
      <b>B1</b>
      <c>C1</c>
   </row>
   <row>
      <a>A2</a>
      <b>B2</b>
   </row>
   <row>
      <a>A3</a>
      <b/>
      <c>C3</c>
   </row>
</table>

此样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:h="header"
 exclude-result-prefixes="h">
    <h:header title="First" element="a"/>
    <h:header title="Second" element="b"/>
    <h:header title="Third" element="c"/>
    <xsl:template match="table">
        <html>
            <table style="border:1px solid black;">
                <tr>
                    <xsl:apply-templates select="document('')/*/h:*"
                     mode="header"/>
                </tr>
                <xsl:apply-templates/>
            </table>
        </html>
    </xsl:template>
    <xsl:template match="row">
        <tr>
            <xsl:apply-templates select="document('')/*/h:*">
                <xsl:with-param name="pContext" select="."/>
            </xsl:apply-templates>
        </tr>
    </xsl:template>
    <xsl:template match="h:*">
        <xsl:param name="pContext"/>
        <td>
            <xsl:value-of select="$pContext/*[name()=current()/@element]"/>
        </td>
    </xsl:template>
    <xsl:template match="h:*" mode="header">
        <th>
            <xsl:value-of select="@title"/>
        </th>
    </xsl:template>
</xsl:stylesheet>

输出:

<html>
    <table style="border:1px solid black;">
        <tr>
            <th>First</th>
            <th>Second</th>
            <th>Third</th>
        </tr>
        <tr>
            <td>A1</td>
            <td>B1</td>
            <td>C1</td>
        </tr>
        <tr>
            <td>A2</td>
            <td>B2</td>
            <td></td>
        </tr>
        <tr>
            <td>A3</td>
            <td></td>
            <td>C3</td>
        </tr>
    </table>
</html>

还有其他样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:h="header"
 exclude-result-prefixes="h">
    <h:header title="First" element="a"/>
    <h:header title="Second" element="b"/>
    <h:header title="Third" element="c"/>
    <xsl:template match="table">
        <html>
            <xsl:apply-templates/>
        </html>
    </xsl:template>
    <xsl:template match="row">
        <table style="border:1px solid black;">
            <xsl:apply-templates select="document('')/*/h:*">
                <xsl:with-param name="pContext" select="."/>
            </xsl:apply-templates>
        </table>
    </xsl:template>
    <xsl:template match="h:*">
        <xsl:param name="pContext"/>
        <tr>
            <th>
                <xsl:value-of select="@title"/>
            </th>
            <td>
                <xsl:value-of select="$pContext/*[name()=current()/@element]"/>
            </td>
        </tr>
    </xsl:template>
</xsl:stylesheet>

输出:

<html>
    <table style="border:1px solid black;">
        <tr>
            <th>First</th>
            <td>A1</td>
        </tr>
        <tr>
            <th>Second</th>
            <td>B1</td>
        </tr>
        <tr>
            <th>Third</th>
            <td>C1</td>
        </tr>
    </table>
    <table style="border:1px solid black;">
        <tr>
            <th>First</th>
            <td>A2</td>
        </tr>
        <tr>
            <th>Second</th>
            <td>B2</td>
        </tr>
        <tr>
            <th>Third</th>
            <td></td>
        </tr>
    </table>
    <table style="border:1px solid black;">
        <tr>
            <th>First</th>
            <td>A3</td>
        </tr>
        <tr>
            <th>Second</th>
            <td></td>
        </tr>
        <tr>
            <th>Third</th>
            <td>C3</td>
        </tr>
    </table>
</html>

注意:我认为你正在使用行标题,因为空元素或不存在元素存在问题。请注意对标题名称和列顺序使用内联映射(可能在其他输入源中)(是否存在)。