0

ルートから値を取得するときに、要素の値に基づいて要素名を変更する必要があります。

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:dat="http://ws.wso2.org/dataservice" version="1.0">
  <xsl:key name="key-by-company_code" match="dat:row" use="dat:company_code" />
    <xsl:template match="company_code">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
  <xsl:template match="dat:rows">
    <xsl:element name="{local-name()}">
      <xsl:for-each select="dat:row[generate-id() = generate-id(key('key-by-company_code', dat:company_code)[1])]">
        <xsl:element name="sae">

        <xsl:attribute name="filename">
            <xsl:value-of select="dat:company_code" />
          </xsl:attribute>
          <xsl:for-each select="key('key-by-company_code', dat:company_code)">
          <xsl:element name="{local-name()}">
                <xsl:element name="row">
                    <xsl:element name="sae_id">
                      <xsl:value-of select="@sae_id" />
                    </xsl:element>  
            <xsl:element name="sae_date">
                      <xsl:value-of select="@sae_date" />
                    </xsl:element>
            <xsl:if test="'company_code' = local-name()">
            <xsl:if test="dat:company_code = '30'">
            <xsl:template match="company_code">
            <Co30>
            <xsl:apply-templates/>
            </Co30>
            </xsl:template>
                    </xsl:if>  
                    </xsl:if>
            <xsl:element name="payment_type">
                      <xsl:value-of select="dat:payment_type" />
                    </xsl:element>
            <xsl:element name="concur_pay">

                <xsl:variable name="Concur-Pay" select="dat:concur_pay" />

                <xsl:choose><xsl:when test="$Concur-Pay = '0'">N</xsl:when><xsl:otherwise>Y</xsl:otherwise></xsl:choose>            
            </xsl:element>

           </xsl:element>
          </xsl:for-each>
        </xsl:element>
      </xsl:for-each>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

上記は、要件に使用しようとしている xslt ですが、機能しません。要素の値に基づいて要素名の名前を変更し、別の要素から値を割り当てる必要があります。例:- company_code が 30 の場合、出力は次のようになります。

<sae filename="30">
<row>
<sae_id>76</sae_id>
<sae_date>2012-12-07-08:00</sae_date>
<Co30>1286.91</Co30>
<payment_type>CASH</payment_type>
<concur_pay>N</concur_pay>
<total>1286.91</total>
</row>
</sae>

ここで、要素「total」の値を「Co 30」に割り当てる必要があります。同様に、company_code が 32、33、または 36 の場合、上記のようになります。

この要素の名前を変更する方法を教えてください。

4

1 に答える 1

0

これを置き換えてみてください:

        <xsl:if test="'company_code' = local-name()">
        <xsl:if test="dat:company_code = '30'">
        <xsl:template match="company_code">
        <Co30>
        <xsl:apply-templates/>
        </Co30>
        </xsl:template>
                </xsl:if>  
                </xsl:if>

これとともに:

<!-- Ensure company_code is a valid number to prevent invalid tag names -->
<xsl:if test="number(dat:company_code) = number(dat:company_code)">
  <xsl:element name="Co{dat:company_code}">
    <xsl:value-of select="dat:total"/>
  </xsl:element>
</xsl:if>

<xsl:element name="{local-name()}"> の後のも削除する必要があり <xsl:for-each>ます。未開封で不要のようです。

于 2013-01-04T21:22:20.947 に答える