下面是我用于将xml转换为平面文件的xsl,它还满足各种其他所需条件。
<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:apply-templates/>
<xsl:text>
"FTR";</xsl:text>
<xsl:value-of select="count(term)+count(term/termCategory)+count(term/relation/termVocabulary)"/>
</xsl:template>
<xsl:template match="term">
<xsl:variable name="vTerm" select="."/>
<xsl:variable name="vRow1" select="'
"GL";'"/>
<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>
示例XML如下所示:
<?xml version="1.0" encoding="utf-8"?>
<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>
除了页脚中的行数之外,一切正常,这应该是平面文件中的行数(不包括页眉和页脚)。
预期产出:
"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 :(得分:1)
此转化:
<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>
FTR;</xsl:text>
<xsl:value-of select=
"string-length($vMainOutput)
-
string-length(translate($vMainOutput, '
',''))
"/>
</xsl:template>
<xsl:template match="term">
<xsl:variable name="vTerm" select="."/>
<xsl:variable name="vRow1" select="'
"GL";'"/>
<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>
应用于提供的XML文档:
<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>
生成想要的正确结果:
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