我遇到了使用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文件带来这么大的灵活性。 任何人都可以帮助我。
答案 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值。
您打算如何处理这些变化?