XSLT映射元素名称
我想编写一个XSLT样式表,通过一些映射规则映射元素名称。为了使样式表可供经验较少的用户自定义,我希望在样式表中单独存储地图,如下所示:XSLT映射元素名称,xslt,map,element,Xslt,Map,Element,我想编写一个XSLT样式表,通过一些映射规则映射元素名称。为了使样式表可供经验较少的用户自定义,我希望在样式表中单独存储地图,如下所示: <mr:mapping-rules> <field src="field1" dest="field1337" /> <field src="field2" dest="field2" /> <field src="field3" dest="field3" /> </mr:mapp
<mr:mapping-rules>
<field src="field1" dest="field1337" />
<field src="field2" dest="field2" />
<field src="field3" dest="field3" />
</mr:mapping-rules>
以下是一些示例输入数据:
<Record>
<field1>123</field1>
<field2>asd</field2>
<field3>456</field3>
</Record>
123
自闭症
456
预期结果是:
<Record>
<field1337>123</field1337>
<field2>asd</field2>
<field3>456</field3>
</Record>
123
自闭症
456
如果有人能给我一个模板应该是什么样子的提示,那就太好了。根据我的评论,这里有一个建议。我编写了一个样式表,其中包含一个表单中的映射文件
<mr:mapping-rules xmlns:mr="http://example.com/mr">
<context pattern="Record">
<field src="field1" dest="field1337" />
</context>
</mr:mapping-rules>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Record/field1">
<xsl:element name="field1337">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
在表单中生成样式表的步骤
<mr:mapping-rules xmlns:mr="http://example.com/mr">
<context pattern="Record">
<field src="field1" dest="field1337" />
</context>
</mr:mapping-rules>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Record/field1">
<xsl:element name="field1337">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
创建上述样式表作为其输出的样式表是
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:mr="http://example.com/mr"
xmlns:oxsl="http://example.com/xsl"
exclude-result-prefixes="oxsl mr">
<xsl:namespace-alias stylesheet-prefix="oxsl" result-prefix="xsl"/>
<xsl:output indent="yes"/>
<xsl:template match="/">
<oxsl:stylesheet version="1.0">
<oxsl:template match="@* | node()">
<oxsl:copy>
<oxsl:apply-templates select="@* | node()"/>
</oxsl:copy>
</oxsl:template>
<xsl:apply-templates/>
</oxsl:stylesheet>
</xsl:template>
<xsl:template match="mr:mapping-rules/context/field">
<oxsl:template match="{../@pattern}/{@src}">
<oxsl:element name="{@dest}">
<oxsl:apply-templates select="@* | node()"/>
</oxsl:element>
</oxsl:template>
</xsl:template>
</xsl:stylesheet>
然后可以在输入上运行生成的样式表,如
<Root>
<Record-List>
<Record>
<field1>foo</field1>
<field2>bar</field2>
<field3>baz</field3>
</Record>
</Record-List>
</Root>
福
酒吧
巴兹
它输出
<Root>
<Record-List>
<Record>
<field1337>foo</field1337>
<field2>bar</field2>
<field3>baz</field3>
</Record>
</Record-List>
</Root>
福
酒吧
巴兹
当然,映射文件可以根据您的需要进行调整,我主要尝试显示一个示例,该示例从映射文件生成第二个样式表,然后应用于输入示例。Martin的解决方案是一个很好的解决方案,因为该方法非常强大且可扩展,但也可以更直接地解决问题:
<xsl:key name="mappings" match="mr:mapping-rules/field" use="@src"/>
<xsl:template match="*">
<xsl:element name="{(key('mappings', name())/@dest, name())[1]}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
<xsl:element>
</xsl:template>
首先,我建议不要列出不应更改的字段。然后我想知道映射是否不需要包含父路径或祖先路径之类的上下文。然后我建议通过编写一个样式表来解决这个问题,该样式表接受映射文件并生成一个新的样式表来实现给定映射文件的特定映射。这是一个好的解决方案。在很多情况下,将输入数据视为定义一组转换规则是合适的,可以使用XSLT本身将其转换为XSLT转换规则。这是解决问题的较短方法。但我想我会使用上面更灵活的解决方案。不过,谢谢你的回复!