2012-04-03 61 views
0

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

这里的2例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="[email protected]" 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,为我做了这些改变,回想起来,我可能应该首先想到这一点。

+1

请出示XSL的一些预期输出,更表示在此''调用的上下文。测试'行[@respondentabn ='']'正在查找“respondentabn”等于零长度字符串的“行”。如果应用'CourseData'作为上下文节点,则它是真实的,因为存在一个这样的行。 – 2012-04-03 23:09:32

回答

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> 

或在任何情况下,如果当前节点是这样的行[@ respondentabn ='']做任何有用的事情,它必须是行的父母,在这种情况下<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> 
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属性变量的值,然后你可以评估当针对变量,而不是子句:

<?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> 

这两种方法都可以满足您的需求,其中一个更容易理解。

+0

我假设你不打算在第二个例子中的。 如果是这样,这两种情况都不适合我,并且他们停止留下名字空白的情况下,我们已经有了名字和ABN。 – Corwin01 2012-04-03 22:26:45

+0

您显示的两个版本不是等同的[row [@respondentabn!='']'选择具有非空的respondentabn属性的行,但不选择没有此属性的行。 '$ respondentabn ='''如果_any_行具有该名称的非空属性,则写为true,但即使更正为仅选择当前行,对于具有表情值或属性丢失的属性也是如此。 – 2012-04-04 00:19:08

+0

为了我自己的启发,我为我提出的两个原始解决方案发布了完整的xslt。您应该看到两种方法的输出是相同的。 – javram 2012-04-04 01:48:11