假设我有这个输入文件
<root>
<keyword>
<name>foo</name>
<value>bar</value>
</keyword>
<keyword>
<name>123</name>
<value>456</value>
</keyword>
</root>
我想要这个输出:
<root>
<keyword>
<name>foobar</name>
<value>bar</value>
</keyword>
<keyword>
<name>123</name>
<value>456</value>
</keyword>
</root>
现在,我有这个有效的转型,但我想知道如何让它更优雅。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<!-- copy all nodes and attributes -->
<xsl:template match="@*|node()" name = "identity">
<xsl:copy >
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "/root/keyword/name[text() = 'foo']">
<name>foobar</name>
</xsl:template>
</xsl:stylesheet>
匹配所需节点后,我再次重复设置,而不是简单地替换它。我可以更优雅地做到这一点吗?我的要求可能听起来有些荒谬,但我想更深入地了解xslt并更好地理解。
非常感谢!
答案 0 :(得分:3)
假设XSLT 2.0,我会这样做(在http://xsltransform.net/3NzcBsW在线):
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:param name="old" select="'foo'"/>
<xsl:param name="new" select="'foobar'"/>
<!-- copy all nodes and attributes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/root/keyword/name[. = $old]">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:value-of select="$new"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
参数看起来更灵活。除此之外,我没有看到缩短它的方法,身份转换模板是转换的核心,并且特定于输入XML示例的一个模板确保我们正在寻找的name
元素获得新的内容。
答案 1 :(得分:0)
XSLT 2.0更短的方式:
FAIL src/test.test.js
● Test suite failed to run
/Users/hannahmccain/Desktop/DEV/expense-report/fullstack-expense-report/client/src/node_modules/user/LoginContainer.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import React, { Component } from 'react'
^^^^^^
SyntaxError: Unexpected token import
at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/ScriptTransformer.js:289:17)
at Object.<anonymous> (src/index.js:11:164)
at Object.<anonymous> (src/test.test.js:3:14)