【问题标题】:XSLT, display PCDATA as CDATAXSLT,将 PCDATA 显示为 CDATA
【发布时间】:2017-10-20 08:37:11
【问题描述】:

感谢收看。

我正在尝试编写一个将生成 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?这似乎是显而易见的解决方案,但我没有找到办法做到这一点。

或者其他方式来解决这个问题?在 para 标记中随机嵌入外部参照标记,我有点难过。

谢谢

【问题讨论】:

  • 那么您使用的是哪个版本的 XSLT,哪个 XSLT 处理器?如果输出是 HTML,但您想在输入中显示某些节点​​的 XML 标记,那么您需要对它们进行序列化,这在 XSLT 3(由开源 Saxon 9.8 HE 支持)中是可能的,例如&lt;xsl:value-of select="serialize(node())"/&gt; 而不是您拥有的 value-of
  • 你也可以做一个xsl:apply-templates和匹配xref然后自己序列化。
  • 对我来说,显而易见的解决方案是转换每个 &lt;para&gt; 的所有子节点(包括文本节点子节点),而不是输出其字符串值,就像您收到的一个答案一样远证明。这当然是最自然的解决方案。

标签: xml xslt


【解决方案1】:

显示为 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"/>
    </
  </
</

这种用于校样的显示,与最终产品的最终用户所看到的不匹配,通常称为假色校样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2013-12-26
    • 2010-10-25
    • 2010-10-29
    • 1970-01-01
    • 2021-02-12
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多