2010-08-23 69 views
3

當我每天在WTF上看到這篇文章時,我大聲笑了起來:http://thedailywtf.com/Articles/WellFormed-XML.aspx,但現在它不再有趣了,因爲我已經開始認識到這個「xml設計模式」頻率。舉例來說,我只是出口從Rational ClearQuest中查詢一些數據,我得到這個:xsl transform for WTF「well formed」example

<?xml version="1.0" encoding="us-ascii"?> 
<?xml-stylesheet type="text/xsl" href="http://scm/rational/clearquest/webservice/resultset.xsl"?> 
<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs"> 
    <header count="3"> 
    <column type="dbid">dbid</column> 
    <column type="id">id</column> 
    <column type="short_string">Abstract</column> 
    </header> 
    <record> 
    <field>33607697</field> 
    <field>PROD00011111</field> 
    <field>The product has a bug that needs fixed.</field> 
    </record> 
</resultset> 

我不是一個XSLT嚮導 - 我可能會想出解決辦法遲早的事情,但它不能傷害問...什麼是最簡單的XSLT樣式變換上述成這樣更有用的東西:

<?xml version="1.0" encoding="us-ascii"?> 
<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs"> 
    <record> 
    <dbid type="dbid">33607697</dbid> 
    <id type="id">PROD00011111</id> 
    <Abstract type="short_string">The product has a bug that needs fixed.</Abstract> 
    </record> 
</resultset> 
+0

問得好(+1)。查看我的答案,獲取完整而簡短的解決方案。 :) – 2010-08-23 20:46:35

回答

1

以下改造

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kColByPos" match="column" 
    use="count(preceding-sibling::*) +1"/> 

<xsl:template match="/*"> 
    <xsl:copy> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates select="record"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="record"> 
    <record> 
    <xsl:apply-templates/> 
    </record> 
</xsl:template> 

<xsl:template match="field"> 
    <xsl:variable name="vColumn" select= 
    "key('kColByPos', position())"/> 

    <xsl:element name="{translate($vColumn, ' ', '_'}"> 
    <xsl:copy-of select="$vColumn/@type"/> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
</xsl:stylesheet> 

當應用所提供的XML文檔

<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs"> 
    <header count="3"> 
    <column type="dbid">dbid</column> 
    <column type="id">id</column> 
    <column type="short_string">Abstract</column> 
    </header> 
    <record> 
    <field>33607697</field> 
    <field>PROD00011111</field> 
    <field>The product has a bug that needs fixed.</field> 
    </record> 
</resultset> 

產生想要的,正確的結果

<resultset dbset="CQMaster" dbname="PROD" entitydefname="TR" count="1" name="_my trs"> 
    <record> 
     <dbid type="dbid">33607697</dbid> 
     <id type="id">PROD00011111</id> 
     <Abstract type="short_string">The product has a bug that needs fixed.</Abstract> 
    </record> 
</resultset> 
+0

+1爲快速解決方案。除非源xml有一個我的類型 - 列名稱中的空格打破結果,否則它工作得很好。我通過用修改腳本解決了這個問題。感謝您的教訓;我從來沒有使用過xsl:key或position()。 – rev 2010-08-23 21:10:21

+0

@rev:哦,我自己應該考慮一下(今天非常不在意)。你解決這個問題正是我所做的。我編輯了答案並在那裏修復了這個問題。 – 2010-08-23 21:28:16