考虑我有一个类似
的xml<reasonConfig>
<reasons/>
</reasonConfig>
我可以将字符串数组作为输入,并希望使用这些值更新节点。所需的输出将类似于
<reasonConfig>
<reasons>
<reason value="First Form"/>
<reason value="Second Form"/>
<reason value="Third Form"/>
</reasons>
</reasonConfig>
String数组的值类似{“ First Form”,“ Second Form”,“ Third Form”}
目前,我将复制特定节点,并使用下面的xsl代码将“ value”字符串更新n次。
<xsl:param name="value" />
<xsl:template match="reason">
<reason value="{$value}"></reason >
</xsl:template>
有什么方法可以一步完成完整的转换吗?例如接收输入值数组并添加与xml中的值相对应的新行?
答案 0 :(得分:0)
michael-hor257k建议的一种变体是使用简单的XSLT-1.0处理器(例如xsltproc
(或任何其他XSLT-1.0处理器),并将字符串作为全局参数传递给样式表。 / p>
在此,该参数称为strings
,并且不同的值由逗号分隔。此样式表使用递归模板将<reason...>
元素与相应的value
属性一起添加。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:param name="strings" />
<xsl:template match="/reasonConfig">
<xsl:copy>
<reasons>
<xsl:call-template name="rs">
<xsl:with-param name="strs" select="concat($strings,',')" />
</xsl:call-template>
</reasons>
</xsl:copy>
</xsl:template>
<xsl:template name="rs">
<xsl:param name="strs" />
<xsl:if test="$strs != ''">
<reason>
<xsl:attribute name="value">
<xsl:value-of select="normalize-space(substring-before($strs,','))" />
</xsl:attribute>
</reason>
<xsl:call-template name="rs">
<xsl:with-param name="strs" select="substring-after($strs,',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
例如,如果您将带有参数的值传递给XSLT样式表,则可以使用linux程序xsltproc
来做到这一点:
xsltproc --stringparam strings "ab,cd,ef" test.xslt test.xml
输出将是
<reasonConfig>
<reasons>
<reason value="ab"/>
<reason value="cd"/>
<reason value="ef"/>
</reasons>
</reasonConfig>
使用Java,方法非常相似:
一种可能性是使用StringJoiner
class生成逗号分隔的字符串。然后将此字符串传递给XSLT处理器。
对于javax.xml.transform.Transformer
,您可以像这样setParameter
method进行此操作(调整arrayStringWithValues
):
// Create and configure XSLT Transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new StreamSource(xslt));
transformer.setParameter("strings", arrayStringWithValues);