我有以下xml:
<backgroundImgage>
<en x="60">filename_en.png</en>
<de x="70">filename_de.png</de>
</backgroundImage>
我尝试重写它得到以下结果
<xsl:element name="bgImage">
<xsl:for-each select="field_background_image/*">
<xsl:element name="{name(.)}">
<xsl:attribute name="x">
<xsl:value-of select="../../field_x_position/name(.)/item/value"/>
</xsl:attribute>
<xsl:value-of select="item/filename"/>
</xsl:element>
</xsl:for-each>
由于可能会添加更多语言,我需要循环使用这些语言。如何选择相应元素的匹配值,因为XPath表达式中的名称(。)当然不起作用。
apply plugin: 'android-apt'
非常感谢你的帮助。
答案 0 :(得分:1)
您正在寻找的表达式是这样的(请注意,XML中没有item
元素,所以我也从表达式中删除了这个元素)
<xsl:value-of select="../../field_x_position/*[name() = current()/name()]/value"/>
或者使用变量来略微简化它。试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/*">
<xsl:element name="bgImage">
<xsl:for-each select="field_background_image/*">
<xsl:variable name="name" select="name()" />
<xsl:element name="{$name}">
<xsl:attribute name="x">
<xsl:value-of select="../../field_x_position/*[name() = $name]/value"/>
</xsl:attribute>
<xsl:value-of select="filename"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
我建议使用XSLT's built-in key机制来解决交叉引用:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="x" match="field_x_position/*" use="name()" />
<xsl:template match="/*">
<backgroundImage>
<xsl:for-each select="field_background_image/*">
<xsl:element name="{name()}">
<xsl:attribute name="x">
<xsl:value-of select="key('x', name())/value"/>
</xsl:attribute>
<xsl:value-of select="filename"/>
</xsl:element>
</xsl:for-each>
</backgroundImage>
</xsl:template>
</xsl:stylesheet>