在某些条件下的结构

时间:2019-06-19 06:56:51

标签: html

我正在尝试html,但是我不知道该怎么做。那是我的,但是不起作用:(:

<xsl:template match="*[contains(local-name(), '.')]">
  <xsl:element name="{translate(local-name(), '.', '_')}" namespace="{namespace-uri()}">
    <xsl:apply-templates select="@* | node()"/>
  </xsl:element>
</xsl:template>

有人知道如何处理吗?

1 个答案:

答案 0 :(得分:0)

这似乎是一个递归分组问题,尽管单个示例并没有真正说明何时将项目包装和/或嵌套为列表。但是,对于XSLT 2或3,可以使用for-each-group使用递归函数来解决它:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:mf="http://example.com/mf"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:function name="mf:wrap" as="element()*">
      <xsl:param name="elements" as="element()*"/>
      <xsl:param name="level" as="xs:integer"/>
      <xsl:for-each-group select="$elements" group-adjacent="boolean(self::*[matches(local-name(), '^li[' || $level || '-9]+$')])">
          <xsl:choose>
              <xsl:when test="current-grouping-key()">
                  <ul class="li{$level}">
                      <xsl:sequence select="mf:wrap(current-group(), $level + 1)"/>
                  </ul>
              </xsl:when>
              <xsl:otherwise>
                  <xsl:apply-templates select="current-group()"/>
              </xsl:otherwise>
          </xsl:choose>
      </xsl:for-each-group>
  </xsl:function>

  <xsl:template match="*[matches(local-name(), '^li[0-9]+$')]">
      <li>
          <xsl:apply-templates/>
      </li>
  </xsl:template>

  <xsl:template match="*[*[matches(local-name(), '^li[0-9]+$')]]">
      <div>
        <xsl:apply-templates select="mf:wrap(*, 1)"/>
      </div>
  </xsl:template>

  <xsl:template match="uz">
      <h5>
          <xsl:apply-templates/>
      </h5>
  </xsl:template>

  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bnnZWK

请注意,上面创建的列表结构略有不同,同一liX级别的所有X项都被包装到单个ul class="liX"包装器中,而您想要的示例在某些地方似乎包裹了几件物品,而在其他地方只包裹了一件物品。