【发布时间】: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">
   Step1 Para:  
<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 支持)中是可能的,例如
<xsl:value-of select="serialize(node())"/>而不是您拥有的value-of。 -
你也可以做一个
xsl:apply-templates和匹配xref然后自己序列化。 -
对我来说,显而易见的解决方案是转换每个
<para>的所有子节点(包括文本节点子节点),而不是输出其字符串值,就像您收到的一个答案一样远证明。这当然是最自然的解决方案。