使用 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.
您打算如何处理这些变化?
我遇到了使用 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.
您打算如何处理这些变化?