2017-10-19 43 views
0

感謝您的期待。XSLT,顯示PCDATA爲CDATA

我正在嘗試編寫一個.xsl文件,它將生成HTML,通過僅顯示具有適用性代碼的文本來更容易地錯誤檢查我們的.xml文件。

我們XML的普通查看器應用程序將根據XML中的應用代碼過濾內容。 (適用性代碼代表各個車型。)無法禁用查看器應用程序中的過濾,這意味着可能有人必須多次檢查每個文件(每個應用代碼一次)以確保每個模型的正確性。

我有嵌套在它的標籤XML數據:

<para>Disconnect main chassis wire harness connector 
MC57 (<xref applicable="UOC_GP0 UOC_HG0 UOC_WC0 UOC_2U0" 
figid="F01"/><xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 
UOC_2U1" figid="F01A"/>, Item 3) from main cab wire 
harness connector MC57 (<xref applicable="UOC_GP0 
UOC_HG0 UOC_WC0 UOC_2U0" figid="F01"/> 
<xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 UOC_2U1" 
figid="F01A"/>, Item 2).</para> 

相關的XSL很簡單:

<xsl:for-each select="para"> 
&#160;&#160;&#160;Step1 Para&#58;&#160;&#160; 
<xsl:value-of select="." /><br /> 
</xsl:for-each> 

但濾除外部參照標籤和離開輸出:

Step1 Para: Disconnect main chassis wire harness connector 
MC57 (, Item 3) from main cab wire harness connector MC57 (, Item 2). 

輸出對於如何寫入xsl是正確的,但不是我想要的。

我想輸出中包含外部參照標籤和他們的屬性,它們混合成的對,作爲書面:

Disconnect main chassis wire harness connector 
MC57 (<xref applicable="UOC_GP0 UOC_HG0 UOC_WC0 UOC_2U0" 
figid="F01"/><xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 
UOC_2U1" figid="F01A"/>, Item 3) from main cab wire 
harness connector MC57 (<xref applicable="UOC_GP0 
UOC_HG0 UOC_WC0 UOC_2U0" figid="F01"/> 
<xref applicable="UOC_GP1 UOC_HG1 UOC_WC1 UOC_2U1" 
figid="F01A"/>, Item 2). 

這是醜陋的,但將讓評卷人知道有與適用性外部參照在第

在xsl中,有沒有辦法指示處理器應該將標記的內容視爲CDATA而不是PCDATA?這似乎是顯而易見的解決方案,但我沒有找到辦法做到這一點。

或者其他方式去做這件事?隨着在para標籤隨機嵌入xref標籤,我有點難住。

感謝

+0

那麼您使用哪種XSLT版本的XSLT處理器?如果輸出是HTML,但您想要在輸入中顯示某些節點​​的XML標記,則需要對它們進行序列化,這在XSLT 3中是可行的(由開源Saxon 9.8 HE支持),例如, ''而不是''你有'的值'。 –

+0

你也可以做一個'xsl:apply-templates'並匹配'xref'並自己序列化它。 –

+0

對我來說,最明顯的解決方案是轉換每個''(包括文本節點的孩子)的所有孩子,而不是輸出其字符串值,就像您迄今爲止收到的答案一樣。當然這是最自然的解決方案。 –

回答

2

顯示爲XML

如果你想使用自己的XML語法,你可以寫這樣的事情讓所有的外部參照元素的元素可見;我已經在各種元素上指定了類屬性,所以你可以調整顯示。 (我也爲para編寫了一個模板,而不是for-each,因爲我認爲過度使用for-each往往會導致糟糕的樣式表,如果您願意,可以更改它。)這就是Daniel Haley的評論談論。

<xsl:template match="para"> 
    <xsl:text>&#160;&#160;&#160;Step1 Para&#58;&#160;&#160;</xsl:text> 
    <xsl:apply-templates/> 
    <br/> 
</ 

<xsl:template match="xref"> 
    <span class="xmlsource"> 
    <span class="start-tag"> 
     <xsl:text>&lt;</xsl:text> 
     <xsl:value-of select="name()"/> 
     <xsl:apply-templates select="@*"/> 
     <xsl:text>/&gt;</ 
    </span> 
    </span> 
</ 

<xsl:template match="xref/@*"> 
    <xsl:text> </xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text>="</xsl:text> 
    <xsl:value-of select="string(.)"/> 
    <xsl:text>"</xsl:text> 
</ 

假彩色顯示

如果是我,我可能會更願意看到一個更加直觀的顯示:顯示可用figid值,與背景顏色將其取消 - 或者如果看起來可能figid="F01"的意思是「在這裏顯示圖形F01」,則顯示圖形本身。 (我將離開後者作爲練習。)

下面的代碼假定當前的適用性代碼在全局變量$appcodes中作爲字符串序列給出。

<xsl:template match="xref"> 
    <xsl:if test="tokenize(@applicable) = $appcodes"> 
    <span class="xref-fig"> 
     <xsl:value-of select="@figid"/> 
    </ 
    </ 
</ 

這種顯示器用於證明檢查,並不打算匹配最終產品的最終用戶將看到的通常被稱爲假色證明。