是否可以使用XSLT为值数组更新XML?

时间:2018-11-17 14:52:29

标签: xml xslt

考虑我有一个类似

的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中的值相对应的新行?

1 个答案:

答案 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);