2013-04-09 26 views
1

我有以下XSL,用於將Oracle SQL開發人員的XML格式轉換爲DBUnit期望的「完整」XML格式(用於創建用於測試的數據集)。在XSLT轉換中獲取第一個孩子

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:java="java" 
    xmlns:dbutil="com.jason.util.DatabaseTestUtil"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:template match="/"> 
     <xsl:text disable-output-escaping="yes">&lt;dataset&gt;</xsl:text> 
     <xsl:text>&#xa;</xsl:text> 
      <xsl:text disable-output-escaping="yes">&lt;table name=""&gt;</xsl:text> 
      <xsl:text>&#xa;</xsl:text> 
      <xsl:for-each select="RESULTS/ROW"> 
       <xsl:for-each select="COLUMN"> 
        <xsl:text disable-output-escaping="yes">&lt;column&gt;</xsl:text> 
         <xsl:value-of select="@NAME" /> 
        <xsl:text disable-output-escaping="yes">&lt;/column&gt;</xsl:text> 
        <xsl:text>&#xa;</xsl:text> 
       </xsl:for-each> 
      </xsl:for-each> 
      <xsl:for-each select="RESULTS"> 
       <xsl:for-each select="ROW"> 
        <xsl:text disable-output-escaping="yes">&lt;row&gt;</xsl:text> 
         <xsl:for-each select="COLUMN"> 
          <xsl:text disable-output-escaping="yes">&lt;value descriptor="</xsl:text> 
          <xsl:value-of select="@NAME"/> 
          <xsl:text disable-output-escaping="yes">"&gt;</xsl:text> 
          <xsl:choose> 
           <xsl:when test="@NAME='NAME'"> 
            <xsl:value-of select="dbutil:generateRandomName()" /> 
           </xsl:when> 
           <xsl:when test="@NAME='MEMBER_SSN'"> 
            <xsl:value-of select="dbutil:generateRandomSsn()" /> 
           </xsl:when> 
           <xsl:when test="@NAME='SPOUSE_SSN'"> 
            <xsl:variable name="spouseSsn"> 
             <xsl:value-of select="." /> 
            </xsl:variable> 
            <xsl:if test="dbutil:hasSpouseSsn($spouseSsn)"><xsl:value-of select="dbutil:generateRandomSsn()" /></xsl:if> 
           </xsl:when> 
           <xsl:when test="@NAME=E_MAIL_ADDRESS"> 
            <xsl:text>[email protected]</xsl:text> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:value-of select="." /> 
           </xsl:otherwise> 
          </xsl:choose> 
          <xsl:text disable-output-escaping="yes">&lt;/value&gt;</xsl:text> 
          <xsl:text>&#xa;</xsl:text> 
         </xsl:for-each> 
         <xsl:text>&#xa;</xsl:text> 
        <xsl:text disable-output-escaping="yes">&lt;/row&gt;</xsl:text> 
        <xsl:text>&#xa;</xsl:text> 
       </xsl:for-each> 
      </xsl:for-each> 
      <xsl:text disable-output-escaping="yes">&lt;/table&gt;</xsl:text> 
      <xsl:text>&#xa;</xsl:text> 
     <xsl:text disable-output-escaping="yes">&lt;/dataset&gt;</xsl:text> 
     <xsl:text>&#xa;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

我打電話給一些「後端」java,以便我的測試集中沒有嵌入人員的私人信息。

不幸的是,通過/ RESULTS/ROW的第一個循環應該只是通過/ RESULT/ROW的第一個子列的循環。

誰能告訴我怎麼去說第一個孩子?

+0

你的XSLT看起來可怕。如果你需要創建一個結果元素,你可以簡單地使用一個文字結果元素,例如'的 ...',沒有必要使用禁用輸出漏出。至於訪問第一個孩子,如果你使用'/ RESULT/ROW [1]',你只選擇第一個'ROW'孩子。或者'/ RESULT/ROW/* [1]'會選擇根目錄RESULT的所有ROW子元素的第一個子元素。 – 2013-04-09 17:19:02

+0

它可能是醜陋的,但它的工作原理。我最終創建了一個名爲firstChild的變量,並將RESULTS/ROW [1]放入其中,並對其進行迭代。 – Jason 2013-04-09 17:33:51

+1

爲什麼您手動構建使用'<數據集>'的所有標籤?這幾乎完全違背了使用XSLT的目的。 – JLRishe 2013-04-09 17:56:12

回答

2

不幸的是,通過/結果第一循環/ ROW應該只是一個 環通/結果/ ROW的第一個孩子的列。

誰能告訴我如何得到第一個孩子?

更換

 <xsl:for-each select="RESULTS/ROW"> 
      <xsl:for-each select="COLUMN"> 
       . . . . . . . . . 
      </xsl:for-each> 
     </xsl:for-each> 

 <xsl:for-each select="RESULTS/ROW[1]/Column"> 
       . . . . . . . . . 
     </xsl:for-each> 
相關問題