使用 XSLT 1 在列表大小可变的 xml 文件中填充列表

Populating list in xml file where list size is variable using XSLT 1

我遇到了使用 XSLT 1 编写 xsl 的问题。

我原来的xml是这样的:

<conf:BasicConfig id="1">
    <conf:attributes>
        <conf:LIST_value>
            <conf:value>5</conf:value>
            <conf:value>10</conf:value>
        </conf:LIST_value>
    </conf:attributes>
</conf:BasicConfig>
<conf:BasicConfig id="2">
    <conf:attributes>
        <conf:LIST_value>
            <conf:value>6</conf:value>
            <conf:value>7</conf:value>
        </conf:LIST_value>
    </conf:attributes>
</conf:BasicConfig>

我有一个值列表,例如 10、9、12。(此列表的大小可能会有所不同) 我想替换 BasicConfig id="1"

列表中的这些值

这样我就有了最终的 xml 比如:

<conf:BasicConfig id="1">
    <conf:attributes>
        <conf:LIST_value>
            <conf:value>10</conf:value>
            <conf:value>9</conf:value>
            <conf:value>12</conf:value>
        </conf:LIST_value>
    </conf:attributes>
</conf:BasicConfig>
<conf:BasicConfig id="2">
    <conf:attributes>
        <conf:LIST_value>
            <conf:value>6</conf:value>
            <conf:value>7</conf:value>
        </conf:LIST_value>
    </conf:attributes>
</conf:BasicConfig>

我可以灵活地在 xsl 文件中以任何方式保留这些值 10、9、12 的列表。 例如,我可以将其保留为:

<xsl:param name="list_values" select="'9,10,12'" />

或者,我可以将其保留为:

<xsl:param name="list_values1" select="'9'" />
<xsl:param name="list_values2" select="'10'" />
<xsl:param name="list_values3" select="'12'" />

或者以另一种方式,但此列表的大小可能会有所不同。有时,我的 xsl 文件将包含 1 个值或 2 个或任何 n 个值。

但我不知道如何为 xsl 文件带来如此大的灵活性。 谁能帮帮我。

由于您没有提供有关 conf 当前 XSLT 或命名空间的任何信息,我能做的就是根据您提供的信息来回答。

您可以使用递归模板来拆分字符串值,一旦有了它,您只需要一个与您的条件 conf:LIST_value 相匹配的模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:conf="c">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
  <xsl:param name="listValues" select="'9,10,12'" />

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

  <xsl:template match="conf:BasicConfig[@id = 1]/conf:attributes/conf:LIST_value">
    <xsl:copy>
      <xsl:call-template name="Split">
        <xsl:with-param name="elementName" select="'conf:value'" />
        <xsl:with-param name="value" select="$listValues" />
      </xsl:call-template>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="Split">
    <xsl:param name="elementName" />
    <xsl:param name="separator" select="','" />
    <xsl:param name="value" />

    <xsl:if test="string($value)">
      <xsl:element name="{$elementName}">
        <xsl:value-of 
              select="substring-before(concat($value, $separator), $separator)"/>
      </xsl:element>
      <xsl:call-template name="Split">
        <xsl:with-param name="elementName" select="$elementName" />
        <xsl:with-param name="separator" select="$separator" />
        <xsl:with-param name="value" 
                        select="substring-after($value, $separator)" />
      </xsl:call-template>
    </xsl:if>

  </xsl:template>
</xsl:stylesheet>

当这是 运行 以下输入时:

<n xmlns:conf="c">
  <conf:BasicConfig id="1">
    <conf:attributes>
      <conf:LIST_value>
        <conf:value>5</conf:value>
        <conf:value>10</conf:value>
      </conf:LIST_value>
    </conf:attributes>
  </conf:BasicConfig>
  <conf:BasicConfig id="2">
    <conf:attributes>
      <conf:LIST_value>
        <conf:value>6</conf:value>
        <conf:value>7</conf:value>
      </conf:LIST_value>
    </conf:attributes>
  </conf:BasicConfig>
</n>

结果是:

<n xmlns:conf="c">
  <conf:BasicConfig id="1">
    <conf:attributes>
      <conf:LIST_value>
        <conf:value>9</conf:value>
        <conf:value>10</conf:value>
        <conf:value>12</conf:value>
      </conf:LIST_value>
    </conf:attributes>
  </conf:BasicConfig>
  <conf:BasicConfig id="2">
    <conf:attributes>
      <conf:LIST_value>
        <conf:value>6</conf:value>
        <conf:value>7</conf:value>
      </conf:LIST_value>
    </conf:attributes>
  </conf:BasicConfig>
</n>

I have flexibility to keep these list of values 10, 9, 12 any way in xsl file.

那么为什么不按照您需要的方式将它们放在您需要的地方呢?

<xsl:template match="conf:BasicConfig[@id='1']">
    <xsl:copy>
        <conf:attributes>
            <conf:LIST_value>
                <conf:value>10</conf:value>
                <conf:value>9</conf:value>
                <conf:value>12</conf:value>
            </conf:LIST_value>
        </conf:attributes>
    </xsl:copy>
</xsl:template>

Sometimes, my xsl file will contain 1 value or 2 or any n value.

您打算如何处理这些变化?