删除节点时 XSLT 缩进丢失
XSLT indentation lost when removing a node
我有以下 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<start>
<param_1>
<short_name>parameter_a</short_name>
</param_1>
<param_2>
<short_name_2>parameter_b</short_name_2>
</param_2>
</start>
我有以下 XSLT 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/" >
<gml:description>
<xsl:value-of select="document('/path/to/mydoc.xml')/start/param_1/short_name"/>
</gml:description>
<gml:description>
<xsl:for-each select="document('/path/to/mydoc.xml')/start/param_2">
<xsl:variable name="my_xlink" select="short_name_2"/>
<xsl:value-of select="$my_offering1_observed_property_xlink"/>
<om:observedProperty xlink:href="{$my_offering1_observed_property_xlink}"/>
</xsl:for-each>
</gml:description>
</xsl:template>
</xsl:stylesheet>
这是我得到的输出
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description>
<gml:description>parameter_b<om:observedProperty xlink:href="parameter_b"/></gml:description>
问题是我想要的是这个结果
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description>
<om:observedProperty xlink:href="parameter_b"/>
但是如果我从我的 XSLT 文件节点中删除 <gml:description>
,最后的 xml 会丢失缩进:
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description><om:observedProperty xlink:href="parameter_b"/>
你能告诉我我做错了什么吗?
谢谢
这似乎是 libxslt
处理器的一个怪癖。我已经使用这个最小样式表成功地重现了这个问题:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<description/>
<observedProperty/>
</xsl:template>
</xsl:stylesheet>
哪个returns:
<?xml version="1.0" encoding="UTF-8"?>
<description/><observedProperty/>
我不知道是否有解决方法*,因为我无法重现您的原始结果。由于两种情况下的结果都是 XML 片段,没有根元素,我不确定您是否有合理的理由抱怨。
(*) 当然,明显的除外:
<xsl:template match="/">
<description/>
<xsl:text> </xsl:text>
<observedProperty/>
</xsl:template>
我有以下 xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<start>
<param_1>
<short_name>parameter_a</short_name>
</param_1>
<param_2>
<short_name_2>parameter_b</short_name_2>
</param_2>
</start>
我有以下 XSLT 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xlink="http://www.w3.org/1999/xlink">
<xsl:output method="xml" indent="yes" encoding="utf-8" />
<xsl:template match="/" >
<gml:description>
<xsl:value-of select="document('/path/to/mydoc.xml')/start/param_1/short_name"/>
</gml:description>
<gml:description>
<xsl:for-each select="document('/path/to/mydoc.xml')/start/param_2">
<xsl:variable name="my_xlink" select="short_name_2"/>
<xsl:value-of select="$my_offering1_observed_property_xlink"/>
<om:observedProperty xlink:href="{$my_offering1_observed_property_xlink}"/>
</xsl:for-each>
</gml:description>
</xsl:template>
</xsl:stylesheet>
这是我得到的输出
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description>
<gml:description>parameter_b<om:observedProperty xlink:href="parameter_b"/></gml:description>
问题是我想要的是这个结果
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description>
<om:observedProperty xlink:href="parameter_b"/>
但是如果我从我的 XSLT 文件节点中删除 <gml:description>
,最后的 xml 会丢失缩进:
<?xml version="1.0" encoding="utf-8"?>
<gml:description>parameter_a</gml:description><om:observedProperty xlink:href="parameter_b"/>
你能告诉我我做错了什么吗?
谢谢
这似乎是 libxslt
处理器的一个怪癖。我已经使用这个最小样式表成功地重现了这个问题:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<description/>
<observedProperty/>
</xsl:template>
</xsl:stylesheet>
哪个returns:
<?xml version="1.0" encoding="UTF-8"?>
<description/><observedProperty/>
我不知道是否有解决方法*,因为我无法重现您的原始结果。由于两种情况下的结果都是 XML 片段,没有根元素,我不确定您是否有合理的理由抱怨。
(*) 当然,明显的除外:
<xsl:template match="/">
<description/>
<xsl:text> </xsl:text>
<observedProperty/>
</xsl:template>