英文:
How can I group these ul elements into ul and li elements XSL
问题
我试了一些东西:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<export>
<article>
<xsl:apply-templates />
</article>
</export>
</xsl:template>
<xsl:template match="ul">
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="ul/text()">
<li>
<xsl:value-of select="." />
</li>
</xsl:template>
</xsl:stylesheet>
但它不像期望的那样工作:
<export>
<article>
Kernpunkte des Discours sind:
<ul>
<li>一种只接受通过自己逐步分析和逻辑反思而得出的合理性验证的认识论,</li>
</ul>
<ul>
<li>一种伦理学,根据这种伦理学,个体应该遵循社会公约,尽责并在道德上行事,</li>
</ul>
<ul>
<li>一种形而上学,虽然(通过逻辑证明)假设存在一个完美的创造者上帝,但给予教会式的机构很少空间,</li>
</ul>
<ul>
<li>一种物理学,将自然视为由虽然是上帝给予的,但是由普遍适用的法则来管理,并要求人类对其进行理性解释,从而最终掌握它。</li>
</ul>
</article>
</export>
能很擅长 XSL 的人能帮我实现吗?
提前感谢!
问候,
Noel
英文:
Anyone can help me with xsl? I don't know how to achieve this:
This is my sample input xml file:
<?xml version="1.0" encoding="UTF-8"?>
<export>
<article>
<h4>Kernpunkte des Discours sind:</h4>
<ul>eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,</ul>
<ul>eine Ethik, gemäß der das Individuum sich im Sinne bewährter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,</ul>
<ul>eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Schöpfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum lässt,</ul>
<ul>eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein gültige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erklärung und damit letztlich ihre Beherrschung zur Aufgabe macht.</ul>
</article>
</export>
I need to group all <ul> elements into <ul><li>…</li></ul> elements so that it will become like this:
<?xml version="1.0" encoding="UTF-8"?>
<export>
<article>
<h4>Kernpunkte des Discours sind:</h4>
<ul>
<li>eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,</li>
<li>eine Ethik, gemäß der das Individuum sich im Sinne bewährter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,</li>
<li>eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Schöpfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum lässt,</li>
<li>eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein gültige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erklärung und damit letztlich ihre Beherrschung zur Aufgabe macht.</li>
</ul>
</article>
</export>
I tried something like this:
<?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="/">
<export>
<article>
<xsl:apply-templates />
</article>
</export>
</xsl:template>
<xsl:template match="ul">
<ul>
<xsl:apply-templates />
</ul>
</xsl:template>
<xsl:template match="ul/text()">
<li>
<xsl:value-of select="." />
</li>
</xsl:template>
</xsl:stylesheet>
But it does not work as expected:
<?xml version="1.0" encoding="UTF-8"?>
<export>
<article>
Kernpunkte des Discours sind:
<ul>
<li>eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,</li>
</ul>
<ul>
<li>eine Ethik, gemäß der das Individuum sich im Sinne bewährter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,</li>
</ul>
<ul>
<li>eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Schöpfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum lässt,</li>
</ul>
<ul>
<li>eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein gültige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erklärung und damit letztlich ihre Beherrschung zur Aufgabe macht.</li>
</ul>
</article>
</export>
Can someone who is very good with xsl help me with my request?
Thanks in advance!
Regards,
Noel
答案1
得分: 1
我会尝试这种方式:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="article">
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="name()">
<xsl:choose>
<xsl:when test="self::ul">
<ul>
<xsl:apply-templates select="current-group()"/>
</ul>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="ul">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
这是XSLT 3.0的代码。
如果article
元素只包含h4
和ul
子元素,你可以只使用以下代码:
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="article">
<xsl:copy>
<xsl:apply-templates select="h4"/>
<ul>
<xsl:apply-templates select="ul"/>
</ul>
</xsl:copy>
</xsl:template>
<xsl:template match="ul">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
英文:
I would try this way:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="article">
<xsl:copy>
<xsl:for-each-group select="*" group-adjacent="name()">
<xsl:choose>
<xsl:when test="self::ul">
<ul>
<xsl:apply-templates select="current-group()"/>
</ul>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="ul">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
This is in XSLT 3.0.
If article
has only h4
and ul
child elements, then you can do only:
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="article">
<xsl:copy>
<xsl:apply-templates select="h4"/>
<ul>
<xsl:apply-templates select="ul"/>
</ul>
</xsl:copy>
</xsl:template>
<xsl:template match="ul">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
</xsl:stylesheet>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论