XSLT将文本节点解析为XML?
在我转换的XML文档中间,有一个CDATA节点,我知道它本身是由XML组成的。我希望将其“递归解析”为XML,这样我也可以对其进行转换。经过查找,我认为我的问题与您的问题非常相似 那是一年前的事了:我想澄清一下:XSLT将文本节点解析为XML?,xml,string,parsing,xslt,Xml,String,Parsing,Xslt,在我转换的XML文档中间,有一个CDATA节点,我知道它本身是由XML组成的。我希望将其“递归解析”为XML,这样我也可以对其进行转换。经过查找,我认为我的问题与您的问题非常相似 那是一年前的事了:我想澄清一下: 它说某些XSLT不能一次性完成这项工作:相反,您需要一种两阶段的方法。我刚刚买了一本关于XSLT2.0的新书。是否仍然没有XSLT指令将字符串节点“重新解析”为XML 在我的例子中,XML字符串节点只是整个节点中的一个节点。因此,在第1阶段,我将只转换输入XML文档的一个片段;其余部分
请参见末尾的更新。
编写为
。然而,它将保留所有应该对XML处理器重要的细节
但是如果不能在管道中运行两个样式表,这对您没有帮助,对吗CDATA
只是一种不同的转义标记的方法,是
等的替代方法。一旦数据被解析(不在XSLT处理器的管辖范围内),您就无法知道它最初是如何在标记中表示的。无论用
还是
表示,左尖括号都保持左尖括号。就像在C中一样,将字符指定为“a”或65或0x41并不重要;一旦程序被编译,您的代码将无法分辨出差异
因此,如果您没有其他方法来确定需要解析输入文档中的哪些数据,那么上述方法都不会对您有所帮助:您不知道在哪里应用saxon:parse(),也不知道如何手动解析,也不知道如何通过以下XSLT转换禁用输出转义
解决办法:
- 例如,您可以通过
猜测哪些节点包含未分析的数据。(请注意,这将测试左尖括号,不管它是表示为字符实体、CDATA节的一部分还是其他任何方式。)有时会出现误报,例如,如果文本节点包含字符串“year<2001”。或者您可以尝试解析每个文本节点(效率非常低),对于那些成功解析格式良好的XML文档的节点,输出树而不是文本test=“contains(,”)
- 或者您可以使用非XML工具(如)预处理XML,因此可以“查看”CDATA标记。但是您已经说过,除了单个XSLT之外,您无法控制任何东西
- 或者,理想情况下,您可以将消息发送回链,告知您正在使用的XML不可行:它们需要以某种方式进行标记,而不是使用CDATA标记,该标记包含未分析的数据。通常,这可以通过指定某些元素名称或使用属性标志来实现。显然,这将取决于谁提供XML