【发布时间】:2020-07-20 11:50:16
【问题描述】:
我有一个大约 10 个参数(键值对)的列表,我想将它们应用于 XML 文档。
当它找到TESTWORD 作为值时,获取以下键并将其替换为适当的值。同时替换该节点的名称。
输入:
<Company>
<Employee>
<FirstName>Homer</FirstName>
<LastName>Simpson</LastName>
<ContactNo>1234567890</ContactNo>
<Address>
<City>Springfield</City>
<Note>TESTWORD key1</Note> <!-- change this -->
</Address>
</Employee>
<Employee>
<FirstName>Peter</FirstName>
<LastName>Griffin</LastName>
<ContactNo>0987654321</ContactNo>
<Address>
<City>Quahog</City>
<Note>TESTWORD key2</Note> <!-- change this -->
</Address>
</Employee>
</Company>
预期输出:
<Company>
<Employee>
<FirstName>Homer</FirstName>
<LastName>Simpson</LastName>
<ContactNo>1234567890</ContactNo>
<Address>
<City>Springfield</City>
<NewElem>My new value</NewElem> <!-- changed -->
</Address>
</Employee>
<Employee>
<FirstName>Peter</FirstName>
<LastName>Griffin</LastName>
<ContactNo>0987654321</ContactNo>
<Address>
<City>Quahog</City>
<NewElem>Another value</NewElem> <!-- changed -->
</Address>
</Employee>
</Company>
我的 XSLT 方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml" encoding="utf-8" />
<!-- Param list -->
<xsl:param name="key1" select="'My new value'" />
<xsl:param name="key2" select="'Another value'" />
<!-- ... more params -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>
<xsl:template match="Note[.='TESTWORD key1']"> <!-- iterate all params -->
<xsl:element name="NewElem">
<xsl:value-of select="$key1" /> <!-- replace all values -->
</xsl:element>
</xsl:template>
</xsl:stylesheet>
第一次出现的<Note>TESTWORD key1</Note> 被<NewElem>My new value</NewElem> 正确替换。但不是其余的事件。
我可以复制 x 次这幅作品:
<xsl:template match="Note[.='TESTWORD keyX']">
<xsl:element name="NewElem">
<xsl:value-of select="$keyX" />
</xsl:element>
</xsl:template>
但也许有一种迭代方法?
PS:我正在使用 Java。
【问题讨论】:
-
您打算在运行时填充这些参数吗?或者这些值可以在样式表中硬编码吗? (无论哪种方式,您都应该使用 key:w3.org/TR/xslt20/#key)
-
@michael.hor257k:键是静态的,值是来自另一个来源的动态。
-
你能把这些值放在另一个 XML 文档中并从那里读取吗?
-
@michael.hor257k:这需要一个额外的步骤。它们来自 JSON 格式的远程源。
-
@michael.hor257k:将值放入我的 XSLT 文件不是问题。我只是不知道,以后如何迭代这些参数。