如何将这些
    元素分组为中的
    • 元素?

huangapple go评论64阅读模式
英文:

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:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;export&gt;
   &lt;article&gt;
      &lt;h4&gt;Kernpunkte des Discours sind:&lt;/h4&gt;
      &lt;ul&gt;eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,&lt;/ul&gt;
      &lt;ul&gt;eine Ethik, gem&#228;&#223; der das Individuum sich im Sinne bew&#228;hrter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,&lt;/ul&gt;
      &lt;ul&gt;eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Sch&#246;pfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum l&#228;sst,&lt;/ul&gt;
      &lt;ul&gt;eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein g&#252;ltige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erkl&#228;rung und damit letztlich ihre Beherrschung zur Aufgabe macht.&lt;/ul&gt;
   &lt;/article&gt;
&lt;/export&gt;

I need to group all &lt;ul> elements into &lt;ul>&lt;li>…&lt;/li>&lt;/ul> elements so that it will become like this:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;export&gt;
   &lt;article&gt;
      &lt;h4&gt;Kernpunkte des Discours sind:&lt;/h4&gt;
      &lt;ul&gt;
         &lt;li&gt;eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,&lt;/li&gt;
         &lt;li&gt;eine Ethik, gem&#228;&#223; der das Individuum sich im Sinne bew&#228;hrter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,&lt;/li&gt;
         &lt;li&gt;eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Sch&#246;pfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum l&#228;sst,&lt;/li&gt;
         &lt;li&gt;eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein g&#252;ltige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erkl&#228;rung und damit letztlich ihre Beherrschung zur Aufgabe macht.&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/article&gt;
&lt;/export&gt;

I tried something like this:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;xsl:stylesheet version=&quot;1.0&quot;
  xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
  &lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot; /&gt;

  &lt;xsl:template match=&quot;/&quot;&gt;
    &lt;export&gt;
      &lt;article&gt;
        &lt;xsl:apply-templates /&gt;
      &lt;/article&gt;
    &lt;/export&gt;
  &lt;/xsl:template&gt;

  &lt;xsl:template match=&quot;ul&quot;&gt;
    &lt;ul&gt;
      &lt;xsl:apply-templates /&gt;
    &lt;/ul&gt;
  &lt;/xsl:template&gt;

  &lt;xsl:template match=&quot;ul/text()&quot;&gt;
    &lt;li&gt;
      &lt;xsl:value-of select=&quot;.&quot; /&gt;
    &lt;/li&gt;
  &lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

But it does not work as expected:

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;export&gt;
   &lt;article&gt;
      Kernpunkte des Discours sind:
      &lt;ul&gt;
         &lt;li&gt;eine Erkenntnistheorie, die nur das als richtig akzeptiert, was durch die eigene schrittweise Analyse und logische Reflexion als plausibel verifiziert wird,&lt;/li&gt;
      &lt;/ul&gt;
      &lt;ul&gt;
         &lt;li&gt;eine Ethik, gem&#228;&#223; der das Individuum sich im Sinne bew&#228;hrter gesellschaftlicher Konventionen pflichtbewusst und moralisch zu verhalten hat,&lt;/li&gt;
      &lt;/ul&gt;
      &lt;ul&gt;
         &lt;li&gt;eine Metaphysik, die zwar (durch logischen Beweis) die Existenz eines vollkommenen Sch&#246;pfer-Gottes annimmt, aber kirchenartigen Institutionen wenig Raum l&#228;sst,&lt;/li&gt;
      &lt;/ul&gt;
      &lt;ul&gt;
         &lt;li&gt;eine Physik, die die Natur als durch zwar gottgegebene, aber allgemein g&#252;ltige Gesetze geregelt betrachtet und dem Menschen ihre rationale Erkl&#228;rung und damit letztlich ihre Beherrschung zur Aufgabe macht.&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/article&gt;
&lt;/export&gt;

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元素只包含h4ul子元素,你可以只使用以下代码:

<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:

&lt;xsl:stylesheet version=&quot;3.0&quot; 
xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;
&lt;xsl:strip-space elements=&quot;*&quot;/&gt;

&lt;xsl:mode on-no-match=&quot;shallow-copy&quot;/&gt;

&lt;xsl:template match=&quot;article&quot;&gt;
	&lt;xsl:copy&gt;
		&lt;xsl:for-each-group select=&quot;*&quot; group-adjacent=&quot;name()&quot;&gt;	
			&lt;xsl:choose&gt;
				&lt;xsl:when test=&quot;self::ul&quot;&gt;
					&lt;ul&gt;
						&lt;xsl:apply-templates select=&quot;current-group()&quot;/&gt;
					&lt;/ul&gt;
				&lt;/xsl:when&gt;
				&lt;xsl:otherwise&gt;
					&lt;xsl:apply-templates select=&quot;current-group()&quot;/&gt;
				&lt;/xsl:otherwise&gt;
			&lt;/xsl:choose&gt;
		&lt;/xsl:for-each-group&gt;
	&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match=&quot;ul&quot;&gt;
	&lt;li&gt;
		&lt;xsl:apply-templates/&gt;
	&lt;/li&gt;
&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

This is in XSLT 3.0.


If article has only h4 and ul child elements, then you can do only:

&lt;xsl:stylesheet version=&quot;3.0&quot; 
xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&gt;
&lt;xsl:output method=&quot;xml&quot; indent=&quot;yes&quot;/&gt;
&lt;xsl:strip-space elements=&quot;*&quot;/&gt;

&lt;xsl:mode on-no-match=&quot;shallow-copy&quot;/&gt;

&lt;xsl:template match=&quot;article&quot;&gt;
	&lt;xsl:copy&gt;
		&lt;xsl:apply-templates select=&quot;h4&quot;/&gt;
		&lt;ul&gt;
			&lt;xsl:apply-templates select=&quot;ul&quot;/&gt;
		&lt;/ul&gt;
	&lt;/xsl:copy&gt;
&lt;/xsl:template&gt;

&lt;xsl:template match=&quot;ul&quot;&gt;
	&lt;li&gt;
		&lt;xsl:apply-templates/&gt;
	&lt;/li&gt;
&lt;/xsl:template&gt;

&lt;/xsl:stylesheet&gt;

huangapple
  • 本文由 发表于 2023年2月23日 23:27:20
  • 转载请务必保留本文链接:https://go.coder-hub.com/75546894.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定