2014-07-24 56 views
0

我們向供應商發送目標文件,它們可以包含0-30個可選字段。我們的XSD可以轉移到標準化的數據庫,但對於低科技印刷廠商來說這不太好。所以我想用XSLT創建數據的非規範化視圖,即使是基本用戶也可以用Excel解碼。技巧不是每個記錄都有相同或相同數量的可選字段,我不知道如何對齊這個工作。XML-反規範化重複同級

<target> 
     <transactionNumber>536880912</transactionNumber> 
     <optionalField> 
      <optionalFieldLabel>PROMO_CODE</optionalFieldLabel> 
      <optionalFieldDescription>ABC127</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
      <optionalFieldLabel>Version</optionalFieldLabel> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
      <optionalFieldLabel>cell</optionalFieldLabel> 
      <optionalFieldDescription>2</optionalFieldDescription> 
     </optionalField> 
    </target> 
    <target> 
     <transactionNumber>536880924</transactionNumber> 
     <optionalField> 
      <optionalFieldLabel>PROMO_CODE</optionalFieldLabel> 
      <optionalFieldDescription>ABC131</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
      <optionalFieldLabel>Version</optionalFieldLabel> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
    </target> 
<target> 
     <transactionNumber>536880213</transactionNumber> 
     <optionalField> 
      <optionalFieldLabel>Version</optionalFieldLabel> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
      <optionalFieldLabel>cell</optionalFieldLabel> 
      <optionalFieldDescription>1</optionalFieldDescription> 
     </optionalField> 
    </target> 

我是新來的所以沒有圖片:(

我想這樣的事情:

536880912___PROMO_CODE___ABC127___Version___CON___cell___2

536880924___PROMO_CODE___ABC131___Version___CON

536880213_____________________________Version___CON___cell___1

或者一個HTML表格,其中我的optionalfieldlabel是每列的標題。

我剛來實現如何簡化我的問題。 基本上我只是需要去掉optionfield和optionalfieldlabel標籤,並使用optionalfieldlabel值用新標籤替換它們。所以它變成看起來像這樣:

<target> 
     <transactionNumber>536880912</transactionNumber> 
     <PROMO_CODE> 
      <optionalFieldDescription>ABC127</optionalFieldDescription> 
     </PROMO_CODE> 
     <Version> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
     <cell> 
      <optionalFieldDescription>2</optionalFieldDescription> 
     </cell> 
    </target> 
    <target> 
     <transactionNumber>536880924</transactionNumber> 
     <PROMO_CODE> 
      <optionalFieldDescription>ABC131</optionalFieldDescription> 
     </PROMO_CODE> 
     <Version> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
    </target> 
<target> 
     <transactionNumber>536880912</transactionNumber> 
     <Version> 
      <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
     <cell> 
      <optionalFieldDescription>1</optionalFieldDescription> 
     </cell> 
    </target> 

在此先感謝。

+0

所以你到目前爲止嘗試過 - 你的問題是缺少你的XSLT。此外,我不完全得到所需輸出中的所有下劃線 - 爲什麼不是簡單的csv? – dirkk

+0

下劃線對齊我的示例輸出,表單未使用選項卡對齊忽略它們。 –

+0

沒有XSLT,因爲我做的事情甚至都接近工作。一個csv實際上會很棒,但是關鍵是插入額外的逗號作爲沒有相同可選字段的記錄。謝謝。 –

回答

0

基本上,我只需要去掉的optionfield和 optionalfieldlabel標籤,並與使用 的optionalfieldlabel值的新標籤替換它們。

這是相當容易做到,使用恆等變換模板複製的一切,是,除了由一個專門的模板處理的optionalField元素:

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

<!-- identity transform --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="optionalField"> 
    <xsl:element name="{optionalFieldLabel}"> 
     <xsl:apply-templates select="optionalFieldDescription"/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 

當應用於的校正輸入:

<root> 
    <target> 
     <transactionNumber>536880912</transactionNumber> 
     <optionalField> 
     <optionalFieldLabel>PROMO_CODE</optionalFieldLabel> 
     <optionalFieldDescription>ABC127</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
     <optionalFieldLabel>Version</optionalFieldLabel> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
     <optionalFieldLabel>cell</optionalFieldLabel> 
     <optionalFieldDescription>2</optionalFieldDescription> 
     </optionalField> 
    </target> 
    <target> 
     <transactionNumber>536880924</transactionNumber> 
     <optionalField> 
     <optionalFieldLabel>PROMO_CODE</optionalFieldLabel> 
     <optionalFieldDescription>ABC131</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
     <optionalFieldLabel>Version</optionalFieldLabel> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
    </target> 
    <target> 
     <transactionNumber>536880213</transactionNumber> 
     <optionalField> 
     <optionalFieldLabel>Version</optionalFieldLabel> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </optionalField> 
     <optionalField> 
     <optionalFieldLabel>cell</optionalFieldLabel> 
     <optionalFieldDescription>1</optionalFieldDescription> 
     </optionalField> 
    </target> 
</root> 

結果將是:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <target> 
     <transactionNumber>536880912</transactionNumber> 
     <PROMO_CODE> 
     <optionalFieldDescription>ABC127</optionalFieldDescription> 
     </PROMO_CODE> 
     <Version> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
     <cell> 
     <optionalFieldDescription>2</optionalFieldDescription> 
     </cell> 
    </target> 
    <target> 
     <transactionNumber>536880924</transactionNumber> 
     <PROMO_CODE> 
     <optionalFieldDescription>ABC131</optionalFieldDescription> 
     </PROMO_CODE> 
     <Version> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
    </target> 
    <target> 
     <transactionNumber>536880213</transactionNumber> 
     <Version> 
     <optionalFieldDescription>CON</optionalFieldDescription> 
     </Version> 
     <cell> 
     <optionalFieldDescription>1</optionalFieldDescription> 
     </cell> 
    </target> 
</root> 
+0

謝謝。我認爲這是微不足道的......我只是希望它對我來說是微不足道的:)我現在更像是一名商業分析師,我曾在20年前破解過,因此我試圖回到一些。其中一些簡單的事情不值得進入我們的企業發展隊列,他們永遠不會被認爲是高度優先完成,但他們對支持方面產生巨大影響。非常感謝。 –

0

請參閱下面的樣式表。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 

    <xsl:strip-space elements="*"/> 

    <xsl:output indent="yes" omit-xml-declaration="yes"/> 

    <xsl:template match="/"> 
     <table> 
      <tbody> 
       <xsl:apply-templates select="root/target"/> 
      </tbody> 
     </table> 
    </xsl:template> 

    <xsl:template match="target"> 
     <tr> 
      <td><xsl:value-of select="transactionNumber"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='PROMO_CODE']"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='PROMO_CODE']/following-sibling::optionalFieldDescription"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='Version']"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='Version']/following-sibling::optionalFieldDescription"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='cell']"/></td> 
      <td><xsl:value-of select="optionalField/optionalFieldLabel[.='cell']/following-sibling::optionalFieldDescription"/></td> 
     </tr> 
    </xsl:template> 

</xsl:stylesheet> 

我想這將成爲您走得更遠的起點。你必須確切地知道完整的30個字段以及它們的放置位置。

+0

有蹭。字段標籤因文件而異,每個作業都不同。對不起,我之前並不清楚。我不知道是否有某種類型的數組函數,可以在處理文件之前讀取整個文件並存儲每個唯一的文件。 –