0

我有一个从 SQL 数据库填充的表。输入的大部分数据都有一个 ABN,我可以用它来查找电子邮件和姓名。有些数据没有 ABN,只有 UID。我不想在表中显示 UID,因为 98% 的时间都是不必要的,所以如果没有名称,我想使用 xsl:when 将名称字段更改为 UID。

以下是 XML 中两种情况的示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <CourseData>
      <row batchid="0" courseid="10101" createdon="04/03/2012 01:08PM" datecompleted="1:08 PM" datecompletedDateValue="1333483680000" lastupdatebyabn="999999" lastupdatebyuid="tsmith" lastupdateon="04/03/2012 01:08PM" num="2" respondentabn="999999" respondentemail="tsmith@test.com" respondentid="1" respondentname="Thomas Smith" respondentuid="tsmith"/>       
      <row batchid="0" courseid="10101" createdon="04/03/2012 01:08PM" datecompleted="1:08 PM" datecompletedDateValue="1333483697000" lastupdatebyabn="" lastupdatebyuid="jsmith" lastupdateon="04/03/2012 01:08PM" num="3" respondentabn="" respondentemail="" respondentid="2" respondentname=" " respondentuid="jsmith"/>
    </CourseData>

这是我正在使用的 XSL,它显然不起作用。

    <xsl:choose>
      <xsl:when test="row[@respondentabn='']">
        <label datafield="@respondentuid"></label>
      </xsl:when>
      <xsl:otherwise>
        <label datafield="@respondentname"></label>
      </xsl:otherwise></xsl:choose></td>

我怎样才能解决这个问题?

编辑:所以在与我的老板交谈后,他说我需要一个循环才能正常工作,但我真的不应该在 .xsl 中这样做。我修改了为我提供数据的 sql 以进行更改,回想起来,我可能一开始就应该想到这一点。

4

2 回答 2

0

使用 XSLT,您无法检查是否存在严格意义上的空字符串。最简单的方法是评估逆:

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

    <xsl:template match="/">
        <doc>   
           <xsl:apply-templates select="CourseData/row"/>   
        </doc>
    </xsl:template>

    <xsl:template match="CourseData/row"> 
        <xsl:choose>
            <xsl:when test="@respondentabn!=''"> 
                <xsl:element name="label">
                    <xsl:attribute name="datafield">
                       <xsl:value-of select="@respondentname"></xsl:value-of>   
                    </xsl:attribute>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:element name="label">
                    <xsl:attribute name="datafield">
                        <xsl:value-of select="@respondentuid"></xsl:value-of>
                    </xsl:attribute>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template> 

</xsl:stylesheet>

产生:

<doc><label datafield="Thomas Smith" /><label datafield="jsmith" /></doc>

另一种方法是将 respondentabn 属性的值分配给变量,然后您可以针对变量评估 when 子句:

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

    <xsl:template match="/">
        <doc>   
           <xsl:apply-templates select="CourseData/row"/>   
        </doc>
    </xsl:template>

    <xsl:template match="CourseData/row"> 
        <xsl:variable name="respondentabn">
           <xsl:value-of select="@respondentabn"/>
        </xsl:variable>

        <xsl:choose>
          <xsl:when test="$respondentabn=''">
            <xsl:element name="label">
               <xsl:attribute name="datafield">
                  <xsl:value-of select="@respondentuid"/>
               </xsl:attribute>
            </xsl:element>
          </xsl:when>
          <xsl:otherwise>
            <xsl:element name="label">
               <xsl:attribute name="datafield">
                  <xsl:value-of select="@respondentname"/>
               </xsl:attribute>
            </xsl:element>
          </xsl:otherwise>
        </xsl:choose>

    </xsl:template> 

</xsl:stylesheet>

产生:

<doc><label datafield="Thomas Smith" /><label datafield="jsmith" /></doc>

两种方法都可以满足您的需求,只是您更容易理解哪种方法。

于 2012-04-03T22:08:03.320 回答
0

你没有给出太多关于样式表的指示,所以很难确定,但我猜你有类似的东西

<xsl:for-each select="row">
<xsl:choose>
      <xsl:when test="row[@respondentabn='']">
        <label datafield="@respondentuid"></label>
      </xsl:when>
      <xsl:otherwise>
        <label datafield="@respondentname"></label>
      </xsl:otherwise>
</xsl:choose>
</xsl:for-each>

或者在任何情况下,如果当前节点使得 row[@respondentabn=''] 做任何有用的事情,它必须是 row 的父节点,在这种情况下<label datafield="@respondentuid">将选择父节点的属性(即使 AVT 语法已更正)。

所以我猜:

<xsl:for-each select="row">
<xsl:choose>
      <xsl:when test="string(@respondentabn)">
        <label datafield="{@respondentuid}"></label>
      </xsl:when>
      <xsl:otherwise>
        <label datafield="{@respondentname}"></label>
      </xsl:otherwise>
</xsl:choose>
</xsl:for-each>

或者,更简洁

<xsl:for-each select="row">
   <label datafield="{@respondentuid[string(.)]|
                      @respondentname[not(string(../@respondentuid))]}"/>
 </xsl:for-each>
于 2012-04-04T00:24:48.170 回答