我正在尝试转换看起来像的XML:
<item attr1="value1" attr2="value2"><nestedItem attr1="value1" attr="value2"/></item>
对于看起来像这样的XML:
<item
attr1="value1"
attr2="value2">
<nestedItem
attr1="value1"
attr="value2"/>
</item>
我正在使用样式表:
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template name="newline">
<xsl:text disable-output-escaping="yes">
</xsl:text>
</xsl:param>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="text()|@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="{name(.)}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我尝试从几个不同的地方调用我的newline
模板,但无法在我的属性之间插入换行符。
谢谢!
答案 0 :(得分:3)
XSLT 1.0和2.0中没有对所需序列化的支持(据我所知,还有即将推出的XSLT 3.0)。
如果您的XSLT处理器允许通过用户提供的 XmlWriter
类进行序列化,那么您可以实现此类序列化。
例如,当使用.NET XslCompiledTransform.Transform()
方法的一个或多个特定重载时,可以将其作为方法之一传递给 { {3}} 即可。传递您自己的类的实例,该实例派生自 XmlWriter
。
答案 1 :(得分:1)
以下模板可能并不漂亮,可能不是最佳做法,但它适用于我。试试看。如果元素上有任何属性,它将不会输出xmlns'属性。
<xsl:template match="*">
<xsl:text disable-output-escaping="yes"><</xsl:text><xsl:value-of select="name()"/><xsl:text>
</xsl:text>
<xsl:for-each select="@*">
<xsl:text>	</xsl:text><xsl:value-of select="concat(name(),'=' ,'"', . ,'"')" /><xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text disable-output-escaping="yes">>
</xsl:text>
<xsl:apply-templates/>
<xsl:text disable-output-escaping="yes"></</xsl:text><xsl:value-of select="name()"/><xsl:text disable-output-escaping="yes">>
</xsl:text>
</xsl:template>
答案 2 :(得分:0)
当你使用带缩进的Saxon序列化程序时,你可以得到接近你想要的输出,但它可能不是你想要的。如果您对格式非常挑剔,那么您必须编写自己的序列化程序或通过调整代码来调整现有的序列化程序。 XML圈子中的通常理念是,您不应该真正关心在解析数据后会被忽略的区别,包括引用字符的选择,属性的顺序以及分隔属性的空格。< / p>