我有一个输入文件:
<a></a>
<b/>
<c>text</c>
我需要将其转换为字符串。使用变压器我得到低于输出:
<a/> <!-- Empty tags should not collapse-->
<b/>
<c>text</c>
如果我使用xslt并且输出方法是“HTML”,我得到以下输出:
<a></a> <!-- This is as expected-->
<b></b> <!-- This is not expected-->
<c>text</c>
我希望结构与输入文件相同。在我的应用程序中需要它,因为我需要计算索引,并且很难更改索引计算逻辑。
使用正确的XSLT是什么?
答案 0 :(得分:0)
什么是XSLT处理器? XSLT只是一种转换xml的语言,所以&#34; html输出&#34;取决于处理器。
我猜这个第一个解决方案对你来说太简单了,但我不得不用它来避免处理原始的html
<xsl:copy-of select="child::node()" />
因为这应克隆原始输入。 在我的例子中,我使用以下内容来提取具有raw属性的所有节点:
<xsl:for-each select="xmlData//node()[@raw]">
<xsl:copy-of select="child::node()" />
</xsl:for-each>
其他选择:
2)根据你以后要做的事情,为每个空节点添加一个属性,即role =&#34; long&#34;,role =&#34; short-hand&#34;。
3) 遍历每个节点(xsl:for-each)
<xsl:choose>
<xsl:when test="string-length(.)=0"> <!-- There is no child-->
<xsl:copy-of select="node()" />
</xsl:when>
<xsl:otherwise>
...whatever normal processing you have
</xsl:otherwise>
4)重新定义你的问题。两者都是有效的XHTML / XML,所以也许你的问题可以在其他地方重新定义或修复。
无论哪种方式,您可能希望在问题中添加更多信息,以便我们可以重现您的问题并在本地进行测试。
P.S。要放置评论的文字/代码太多,但这就属于这个。
答案 1 :(得分:0)
可能的替代方法是使用disable-output-escaping,如下所示:
<xsl:text disable-output-escaping="yes"><a></a></xsl:text>
但我明白这是一个肮脏的解决方案......