0

SQL データベースから作成されたテーブルがあります。入力されたほとんどのデータには、電子メールと名前の検索に使用できる ABN が含まれています。一部のデータには ABN がなく、UID しかありません。UID は 98% の確率で不要なので、テーブルに表示する必要はありません。そのため、名前がない場合は xsl:when を使用して名前フィールドを UID に変更します。

XML での 2 つのケースの例を次に示します。

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

スタイルシートをあまり示していないので、確信が持てませんが、次のようなものがあると思います

<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=''] が有用なことを行うようなものである場合、行の親である必要があり、その場合<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 に答える
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 に答える