2017-10-19 62 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"/> 
    </ 
    </ 
</ 

这种显示器用于证明检查,并不打算匹配最终产品的最终用户将看到的通常被称为假色证明。