Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT在生成文本时会产生很好的缩进_Xml_Xslt_Xslt 1.0 - Fatal编程技术网

Xml XSLT在生成文本时会产生很好的缩进

Xml XSLT在生成文本时会产生很好的缩进,xml,xslt,xslt-1.0,Xml,Xslt,Xslt 1.0,我想创建一个XSLT转换,它将xml文档转换为文本格式。此文本格式是结构化的,因此应相应地进行格式化,即缩进 例如: 鉴于这份文件 <root> <l1> <l2> <l3> <l4> </l4> </l3> <l3>

我想创建一个XSLT转换,它将xml文档转换为文本格式。此文本格式是结构化的,因此应相应地进行格式化,即缩进

例如:

鉴于这份文件

<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>
如果有更多的层次,它们应该缩进得更深。xml文档的确切深度是可变的。此外,还可以删除或添加某些节点,如节点“foo”和“l2”的示例所示

使用xslt以可维护的方式实现这一点吗?版本为xslt-1.0和exslt

问候,

Jost

是的,您所需要做的就是为每个迭代级别的输出预先添加一些制表符/空格

类似于以下内容的内容:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:variable name="vSpaces" select=
 "'                                                                 '"/>

 <xsl:template match="*/*">
  <xsl:param name="pIndent" select="0"/>
     <xsl:value-of select="substring($vSpaces, 1, $pIndent)"/>
     <xsl:value-of select="concat(name(), ' (')"/>
     <xsl:text>&#xA;</xsl:text>
     <xsl:apply-templates select="*">
       <xsl:with-param name="pIndent" select="$pIndent+string-length(name())+3"/>
     </xsl:apply-templates>
     <xsl:value-of select=
     "substring($vSpaces, 1, $pIndent+ string-length(name()))"/>
     <xsl:text>)&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>
l1 (
     l2 (
          l3 (
               l4 (
                 )
            )
          l3 (
               l4 (
                 )
            )
       )
  )
此外,还可以根据需要删除或添加某些节点 可以在节点为“foo”和“l2”的示例中看到

分两次组织转换,在第一次转换中,将源XML文档转换为所需的最终XML文档。然后在第二步中应用上述转换以生成所需的文本结果


有关更多信息,请搜索“XSLT多通道转换”。

我将采用您的方法,尤其是双通道转换。但是,我将使用一个函数来创建缩进选项卡,而不是选择某个长字符串的子字符串。如何工作可以在这里找到,第二个答案:@Jost,如果您使用原语递归来填充所需的字符串,您可能会因堆栈溢出异常而崩溃N~1000。还有另一个复活的解决方案,它可以顺利地填充数百万个字符。如果你有兴趣了解更多关于这项技术的知识,请随便问个问题。事实上,N大约1000对于我的应用应该足够了。但我仍然对另一种方式感兴趣,所以你能详细说明一下,或者给我一些搜索词或什么吗?
<root>
    <l1>
        <l2>
            <l3>
                <l4>
                </l4>
            </l3>
            <l3>
                <l4>
                </l4>
            </l3>
        </l2>
    </l1>
</root>
l1 (
     l2 (
          l3 (
               l4 (
                 )
            )
          l3 (
               l4 (
                 )
            )
       )
  )