XSLT,将PCDATA显示为CDATA

时间:2017-10-19 15:43:33

标签: xml xslt

感谢您的光临。

我正在尝试编写一个生成HTML的.xsl文件,以便更容易错误检查我们的.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的写入方式是正确的,但不是我想要的。

我希望输出包含外部参照标记及其混合到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).

哪个是丑陋的,但会让修正案知道在参数中有适用性的外部参照。

在xsl中,有没有办法表明处理器应该将标签的内容视为CDATA而不是PCDATA?这似乎是一个明显的解决方案,但我找不到这样做的方法。

还是其他一些方法呢?随着外部标签中的外部参照标记嵌入,我有点难过。

由于

1 个答案:

答案 0 :(得分:2)

以XML格式显示

如果要使用XML语法使所有外部参照元素元素可见,您可以编写类似这样的内容;我已经在各种元素上指定了类属性,因此您可以调整显示。 (我还为para写了一个模板,而不是for-each,因为我认为过度使用for-each往往导致可怕的样式表。如果你愿意,可以改回来。)这就是Daniel Haley& #39;评论正在谈论。

<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"意味着&{ #34;在这里显示图F01&#34;,显示图形本身。 (我将把后者作为锻炼给你。)

以下代码假定当前适用性代码在全局变量$appcodes中作为字符串序列给出。

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

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