gpt4 book ai didi

xslt - 如何防止 XSLT 换行?

转载 作者:行者123 更新时间:2023-12-04 12:25:27 24 4
gpt4 key购买 nike

我有一些这样的 XML:

<root>
<do-not-sort>
<z/>
<y/>
</do-not-sort>
<sortable>
<e f="fog" h="bat" j="cat">
<n n="p"/>
<m n="p"/>
</e>
<d b="fop" c="bar" k="cab">
<m o="p"/>
<m n="p"/>
</d>
</sortable>
</root>

我想通过文本表示对“可排序”元素的子元素进行排序,最后得到:
<root>
<do-not-sort>
<z/>
<y/>
</do-not-sort>
<sortable>
<d b="fop" c="bar" k="cab">
<m n="p"/>
<m o="p"/>
</d>
<e f="fog" h="bat" j="cat">
<m n="p"/>
<n n="p"/>
</e>
</sortable>
</root>

我目前通过应用以下 XSLT 模板来做到这一点:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes" encoding="UTF-8" />

<xsl:template match="@* | /">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="normalize-space(text()[1])" />
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="sortable//*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="normalize-space(text()[1])" />
<xsl:apply-templates select="*">
<xsl:sort data-type="text" select="local-name()" />
<xsl:sort data-type="text" select="@*" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

排序工作正常,但如果排序的元素有很多属性,后面的属性每个都换行,例如:
<sortable>
<this is="an" element="with" a="lot" of="attributes"
and="the"
excess="ones"
each="wrap"
onto="their"
own="line"/>

我如何将所有这些属性保持在同一行,即
<sortable>
<this is="an" element="with" a="lot" of="attributes" and="the" excess="ones" each="wrap" onto="their" own="line"/>

最佳答案

How do I keep all these attributes on the same line



在您的代码中,替换 :
  <xsl:output method="xml" indent="yes" encoding="UTF-8" /> 


  <xsl:output method="xml" encoding="UTF-8" /> 

当然,这将在一行中生成完整的输出!在编写此 XSLT 2.0 时,仍然没有对输出的序列化进行更细粒度的控制。

如果您需要缩进某些元素而某些不需要缩进,那么您将不得不提供您自己的后处理(并且这种后处理可能更容易用不同于 XSLT 的东西来编写)。

更新 :

实际上,使用 Saxon 9.1.07 和
  <xsl:output method="html" encoding="UTF-8" />

其中完整的转换是:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html" encoding="UTF-8" />

<xsl:template match="@* | /">
<xsl:copy>
<xsl:apply-templates select="@* | node()" />
</xsl:copy>
</xsl:template>

<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="normalize-space(text()[1])" />
<xsl:apply-templates select="*"/>
</xsl:copy>
</xsl:template>

<xsl:template match="sortable//*">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:value-of select="normalize-space(text()[1])" />
<xsl:apply-templates select="*">
<xsl:sort data-type="text" select="local-name()" />
<xsl:sort data-type="text" select="@*" />
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

</xsl:stylesheet>

并且源 XML 文档是:
<root>
<do-not-sort>
<z></z>
<y></y>
</do-not-sort>
<sortable>
<this is="an" element="with" a="lot" of="attributes" and="the" excess="ones" each="wrap" onto="their" own="line"></this>
<e f="fog" h="bat" j="cat"></e>
<d b="fop" c="bar" k="cab"></d>
<d b="foo" c="baz" k="cap"></d>
</sortable>
</root>

我得到了想要缩进的输出:
<root>
<do-not-sort>
<z></z>
<y></y>
</do-not-sort>
<sortable>
<this is="an" element="with" a="lot" of="attributes" and="the" excess="ones" each="wrap" onto="their" own="line"></this>
<e f="fog" h="bat" j="cat"></e>
<d b="fop" c="bar" k="cab"></d>
<d b="foo" c="baz" k="cap"></d>
</sortable>
</root>

关于xslt - 如何防止 XSLT 换行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3251817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com