Number of rows in a flat file transformed from xml using xslt

后端 未结 1 1128
你的背包
你的背包 2021-01-22 04:36

Below is the xsl I have used for transforming an xml to a flat file, whci also satisfies various other required conditions.



        
相关标签:
1条回答
  • 2021-01-22 04:59

    This transformation:

    <xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:ext="http://exslt.org/common">
         <xsl:output omit-xml-declaration="yes" indent="yes"/>
         <xsl:strip-space elements="*"/>
    
         <xsl:variable name="vrtfDefaults">
           <termCat/>
           <termVocab/>
         </xsl:variable>
    
         <xsl:variable name="vDefaults" select=
          "ext:node-set($vrtfDefaults)"/>
    
         <xsl:variable name="vQ">"</xsl:variable>
    
         <xsl:template match="Zthes">
          <xsl:text>HDR";"PIGLSSTD";"20120112045620";"F":</xsl:text>
    
            <xsl:variable name="vMainOutput">
             <xsl:apply-templates/>
            </xsl:variable>
    
           <xsl:copy-of select="$vMainOutput"/>
    
          <xsl:text>&#xA;FTR;</xsl:text>
    
          <xsl:value-of select=
           "string-length($vMainOutput)
          -
            string-length(translate($vMainOutput, '&#xA;',''))
           "/>
         </xsl:template>
    
         <xsl:template match="term">
           <xsl:variable name="vTerm" select="."/>
    
           <xsl:variable name="vRow1" select="'&#xA;&quot;GL&quot;;'"/>
    
             <xsl:for-each select=
              "termCategory
              |
               $vDefaults/termCat[not($vTerm/termCategory)]">
               <xsl:variable name="vRow2" select=
                   "concat($vRow1, $vQ, ., $vQ, ';')"/>
    
               <xsl:for-each select=
                "$vTerm/termVocabulary
                |
                 $vDefaults/termCat[not($vTerm/termVocabulary)]
                ">
                 <xsl:variable name="vRow3" select=
                   "concat($vRow2, $vQ, ., $vQ, ';')"/>
    
                <xsl:for-each select=
                 "$vTerm/relation/termVocabulary
                 |
                  $vDefaults/termCat[not($vTerm/relation/termVocabulary)]
                 ">
                <xsl:value-of select="concat($vRow3, $vQ, ., $vQ, ';')"/>
              </xsl:for-each>
              </xsl:for-each>
             </xsl:for-each>
         </xsl:template>
    
         <xsl:template match="text()"/>
    </xsl:stylesheet>
    

    when applied on the provided XML document:

    <GetSavedReportResponse>
        <ResponseType>Success</ResponseType>
        <FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
        <FileSizeBytes>7816</FileSizeBytes>
        <FileDataFormat>XML</FileDataFormat>
        <FileData>
            <Zthes>
                <term>
                    <termId>49555</termId>
                    <termUpdate>add</termUpdate>
                    <termName>Active Personnel</termName>
                    <termVocabulary>People Status Global Term1</termVocabulary>
                    <termVocabulary>Global People Status Term1</termVocabulary>
                    <termCategory>PDA Term1</termCategory>
                    <termCategory>PDI Term1</termCategory>
                    <termCategory>GLB Term1</termCategory>
                    <relation weight="100">
                        <termId>49556</termId>
                        <relationType>EQ Term1</relationType>
                        <termName>term name Term1</termName>
                        <termVocabulary>term vocabulary Term1</termVocabulary>
                    </relation>
                    <relation weight="100">
                        <termId>49557</termId>
                        <relationType>BT</relationType>
                        <termName>General Active Personnel</termName>
                        <termVocabulary>People Status Global Updated</termVocabulary>
                    </relation>
                </term>
                <term>
                    <termId>49556</termId>
                    <termUpdate>add</termUpdate>
                    <termName>Leave of Absence Personnel</termName>
                    <termVocabulary>People Status Global Term2</termVocabulary>
                    <termCategory>GLB Term2</termCategory>
                    <termCategory>PDI Term2</termCategory>
                    <relation weight="100">
                        <relationType>BT</relationType>
                        <termId>49554</termId>
                        <termName>General Non-Active Personnel Term2</termName>
                        <termVocabulary>People Status Global Term2</termVocabulary>
                    </relation>
                </term>
            </Zthes>
        </FileData>
    </GetSavedReportResponse>
    

    produces the wanted, correct result:

    HDR";"PIGLSSTD";"20120112045620";"F":
    "GL";"PDA Term1";"People Status Global Term1";"term vocabulary Term1";
    "GL";"PDA Term1";"People Status Global Term1";"People Status Global Updated";
    "GL";"PDA Term1";"Global People Status Term1";"term vocabulary Term1";
    "GL";"PDA Term1";"Global People Status Term1";"People Status Global Updated";
    "GL";"PDI Term1";"People Status Global Term1";"term vocabulary Term1";
    "GL";"PDI Term1";"People Status Global Term1";"People Status Global Updated";
    "GL";"PDI Term1";"Global People Status Term1";"term vocabulary Term1";
    "GL";"PDI Term1";"Global People Status Term1";"People Status Global Updated";
    "GL";"GLB Term1";"People Status Global Term1";"term vocabulary Term1";
    "GL";"GLB Term1";"People Status Global Term1";"People Status Global Updated";
    "GL";"GLB Term1";"Global People Status Term1";"term vocabulary Term1";
    "GL";"GLB Term1";"Global People Status Term1";"People Status Global Updated";
    "GL";"GLB Term2";"People Status Global Term2";"People Status Global Term2";
    "GL";"PDI Term2";"People Status Global Term2";"People Status Global Term2";
    FTR;14
    
    0 讨论(0)
提交回复
热议问题