【发布时间】:2016-04-03 11:21:17
【问题描述】:
我有一个 xml 文件,需要以特定方式格式化以确保可读性。
源 XML
<?xml version="1.0" encoding="UTF-8"?>
<facility>
<attributes>
<id>1</id>
<name>Facility Name</name>
<coordinate>Lat,Long</coordinate>
<projection>mercator</projection>
<units>imperial</units>
<showcart>yes</showcart>
<shotplanner>yes</shotplanner>
<sound>on</sound>
<gfbkgcolor>#ff0000</gfbkgcolor>
<gftxtcolor>#ffffff</gftxtcolor>
<gcbkgcolor>#ffffff</gcbkgcolor>
<gctxtcolor>#000000</gctxtcolor>
</attributes>
</facility>
预期输出
<facility name="Facility Name" id="1"
coordinate="Lat,Long" projection="mercator"
units="imperial" showcart="yes" shotplanner="yes"
sound="on" gfbkgcolor="#ff0000" gftxtcolor="#ffffff"
gcbkgcolor="#ffffff">
</facility>
我有一个复杂的 xml 文件,但这就是我想要做的。
XSL 模板
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="facility/attributes">
<facility id="{id}" name="{name}"
coordinate="{coordinate}">
</facility>
<xsl:text>
</xsl:text>
<test>"hello"</test>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
使用这个<xsl:text>&#xA;</xsl:text> 似乎会引发错误并且不显示输出xml。
- 是否可以在使用 xsl 的某些属性后进行换行?
- 我可以在给定元素中的子元素之间设置换行符吗(这样可以对它们进行逻辑分组)?
我正在通过 php 形成上述 xml。一旦我有了 xml,我希望它按照上面提到的格式进行格式化。我可以使用 php 字符串来做到这一点,但它是一个巨大的文件,这样做会很乏味。可以用xsl来解决这个问题吗?
任何关于如何实现这一点的指针将不胜感激。谢谢
【问题讨论】:
-
您需要了解 XSLT 的处理模型采用输入树并将其转换为具有元素节点和属性节点的结果树,而属性的任何格式以及它们之间的空间都是可选的序列化创建结果树之后的步骤。因此,某些属性之间的换行符不是 XSLT 转换创建的,而是序列化的一部分。并且 XSLT 1.0 定义的序列化选项不提供任何属性之间的换行设置。
-
那么实现该输出的唯一方法是使用具有正确格式的 php 将其写入文件?
-
要将
attributes元素的子元素转换为属性,您可以优雅地使用XSLT,但要强制执行特定格式的属性,您需要查看XSLT 处理器的序列化选项或自己实现序列化,在 PHP 或 XSLT 中(如 lenzconsulting.com/xml-to-string)。
标签: php xml xslt formatting line-breaks