【发布时间】:2020-07-20 16:07:53
【问题描述】:
我有一个Map,其中包含几个我想使用 XSLT 应用于 XML 文档的条目。
每当它在 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 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>
Java:
Map<String, String> map = new HashMap<>();
map.put("key1", "my value");
map.put("key2", "another value");
try {
TransformerFactory factory = TransformerFactory.newInstance();
Source xslt = new StreamSource(new File("doc.xslt"));
Transformer transformer = factory.newTransformer(xslt);
transformer.setParameter("map", map); // Passing map as parameter
Source text = new StreamSource(new File("doc.xml"));
transformer.transform(text, new StreamResult(new File("newXml.xml")));
} catch (URISyntaxException | TransformerException ex) {}
XSLT:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output indent="yes" method="xml" encoding="utf-8" />
<xsl:key name="map" /> <!-- the map with my keys and values -->
<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:template match="Note[.='TESTWORD key2']">
<xsl:element name="NewElem">
<xsl:value-of select="$key2" />
</xsl:element>
</xsl:template>
-->
</xsl:stylesheet>
你可以在这里查看:http://xsltransform.net/3N7GxDd
【问题讨论】:
-
声明
<xsl:key name="map" /> <!-- the map with my keys and values -->的部分没有任何意义。密钥不是将映射从宿主语言传递到 XSLT 的工具。传入映射的唯一方法是在 XSLT/XPath 中具有等效结构,即在 XSLT 3 和 Saxon 9.8 或更高版本中。但是您将使用xsl:param,如stackoverflow.com/a/62996659/252228 所示,您需要将Java 映射转换为XdmMap。