3

我有一个输入文件:

<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 使用?

4

2 回答 2

0

什么 XSLT 处理器?XSLT 只是一种转换 xml 的语言,因此“html 输出”取决于处理器。

我猜这第一个解决方案对你来说太简单了,但我不得不使用它来避免处理原始 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="long"、role="short-hand"。

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,所以也许您的问题可以在其他地方重新构建或修复。

无论哪种方式,您都可能希望在您的问题中添加更多信息,以便我们可以重现您的问题并在本地进行测试。

PS 太多的文本/代码无法发表评论,但这就是它应该属于的地方。

于 2015-03-24T06:53:28.713 回答
0

一种可能的替代方法是像这样使用禁用输出转义:

<xsl:text disable-output-escaping="yes">&lt;a&gt;&lt;/a&gt;</xsl:text>

但我知道这是一个肮脏的解决方案......

于 2017-10-22T18:35:46.560 回答