在xml文件中填充列表,其中列表大小是使用XSLT 1变量的

时间:2015-01-10 19:22:42

标签: xml xslt xslt-1.0

我遇到了使用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文件带来这么大的灵活性。 任何人都可以帮助我。

2 个答案:

答案 0 :(得分:2)

由于您尚未提供有关当前XSLT或conf命名空间的任何信息,我所能做的最好是根据您提供的信息进行回答。

您可以使用递归模板来分割字符串值,一旦完成,您只需要一个符合条件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>

答案 1 :(得分:0)

  

我可以灵活地以任何方式保留这些值列表10,9,12   xsl文件。

那为什么不在你需要它们的地方完全按照你需要的方式保存它们呢?

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

有时,我的xsl文件将包含1个值或2或任何n值。

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