2011-06-30 85 views
0

我有一個關於XML轉換的問題,我有一個XML可以轉換爲另一個XML。 我的xls非常簡單,只需要我想要的字段。我注意到的是,如果例如我有1,2,3,4並且在我的xsl中,我只是決定我想要1,3這2也會與它一起。我相信我讀了xsl的默認規則,例如:忽略XSL中的XML標記

我需要爲每個標記創建一個規則,即使是我不想要的規則。我如何處理那些我不想要的東西? (我嘗試了一些東西,但它仍然輸出它)。 在直接XML 2 XML翻譯中是否有任何教程或好的頁面?

所有的見解都很棒,我更多地去google了。

謝謝。

這是我的XSL,因爲它目前爲不匹配過濾器上:

<?xml version="1.0" encoding="windows-1252"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes" method="xml" /> 

    <!--FileImport--> 

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

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

    <xsl:template match="StartParam"> 
     <StartParam> 
      <xsl:attribute name="name"> 
       <xsl:value-of select="@name" /> 
      </xsl:attribute> 
      <xsl:attribute name="value"> 
       <xsl:value-of select="@value" /> 
      </xsl:attribute> 
     </StartParam> 
    </xsl:template> 


    <!-- CLip --> 
    <xsl:variable name="fields" select="'|clip|number|technical_comments|channel|'" /> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()" /> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="Clip"> 
     <xsl:copy> 
      <xsl:apply-templates select= 
       "*[contains($fields, concat('|', @name, '|'))]" /> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

,有點我的XML是

<?xml version="1.0" encoding="windows-1252" ?> 
<?xml-stylesheet type="text/xsl" href="test.xsl"?> 

<FileImport> 
    <Global> 
     <GlobalParam name="RollName" value="Scene1" /> 
     <GlobalParam name="TapeOrg" value="10:00:00:00" /> 
     <GlobalParam name="ReadStart" value="00:00:00:00" /> 
     <GlobalParam name="ReadDuration" value="00:02:26:18" /> 
    </Global> 
    <Roll> 
     <Field name="ingest_report" value="&lt;?xml version=&quot;1.0&quot; standalone=&quot;yes&quot;?&gt;&#xD;&#xA;&lt;DataSet1 
     </Roll> 
     <Clip> 
      <Field name="audio_format" value="" group="Ingest" /> 
      <Field name="camera_id" value="" group="Ingest" /> 
     </Clip> 

    </FileImport> 

,希望我的輸出會看起來像

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="testFIDEF.xsl"?> 

<FileImport> 
    <Global> 
     <GlobalParam name="RollName" value="Scene_Around_Six_Tape_3_BUFVC003-14 10:00:00:00" /> 
     <GlobalParam name="TapeOrg" value="10:00:00:00" /> 
     <GlobalParam name="ReadStart" value="00:00:00:00" /> 
     <GlobalParam name="ReadDuration" value="00:02:26:18" /> 
    </Global> 

    <MasterClip> 
     <Field name="clip_description" value="Interview Captain Austin Ardill re Terence O'Neill" group="Ingest" /> 
     <Field name="rushes_roll_number" value="BUFVC003" group="Ingest" /> 
     <Field name="source_image_format" value="" group="Ingest" /> 
     <Field name="technical_comments" value="" group="Ingest" /> 
    </MasterClip> 
</FileImport> 
+2

如果您發佈了一些代碼,那麼我們可以看到您出錯的位置,這將非常有用。 –

+0

這實際上取決於您的變換的設計。 –

+0

你在說什麼,我覺得還不夠。例如,通過指令''將模板應用於當前上下文的所有子項。如果你不明確地管理這些孩子,內置的規則將在後臺工作,因此有些驚喜。你應該現在顯示XML輸入和想要的輸出。 –

回答

2

默認情況下,如果沒有與另一個模板rul匹配,轉換將超出任何文本節點的值即您可以通過添加模板來避免這種情況:

<xsl:template match="text()|@*" /> 

這將覆蓋文本和屬性的默認規則。這確實意味着您需要明確選擇要使用xsl:value-of輸出的文本值。

+0

我該把它放在xsl中?我認爲這是在一開始,但它仍然行不通! – user685590

+0

最好先放置它,以免影響後面的規則。如果節點正在與另一個規則匹配,那麼可能仍然有其值輸出。你能否在你的問題中包含一些代碼來複制這個問題? – detaylor

+0

已更新爲XSL代碼。謝謝參觀。 – user685590

1

按照您的意見:

搜索的作品,它只是返回一個的我指定,但顯然我不想<roll>與輸出一起走。

看的這部分內容變換:

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

這樣的模板被稱爲身份轉型。因爲它的任務是將輸入中的所有內容都複製到輸出中,所以當您在轉換中使用它時,必須明確地關閉不需要的元素。根據你的意見,如果你不想roll你需要一個模板:

<xsl:template match="roll"/> 

也就是說,你重寫的身份,使該元素的變換一籌莫展。