2015-01-10 43 views
-1

我坚持写作XSL问题使用XSLT 1填充列表,列表大小是可变的使用XSLT 1

我的原始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> 

我有灵活性来保持这些值的列表10,9,12任何方式在xsl文件。 对于例如,我可以把它作为:

<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文件。 任何人都可以帮助我。

+0

如果您提供了当前的XSLT文件,这将会很有帮助。 – JLRishe

+0

也请告诉你正在使用的主机系统。如果是Java或.NET,那么您可以轻松地将节点列表作为XSLT参数传递,这比通过逗号分隔的字符串更加通用。 – Tomalak

+0

为什么这被标记为撒克逊和Xalan? –

回答

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

非常感谢。你太棒了!我是xsl的新手,这对我有很大的帮助。 –

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

您打算如何处理这些更改?