我在使用 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。(此列表的大小可能会有所不同)我想替换列表中这些值,其中基本配置 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文件。任何人都可以帮助我。
由于您没有提供有关当前 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>
我可以灵活地将这些值列表 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 个值。
您计划如何处理这些变化?