尝试使用带有更多和更少语句的推送(而不是拉)XSLT 。apply-templates
for-each
没有什么规定元素的定义或其属性必须在同一个模板中。因此,当您为元素制作模板时<text>
,您可以只创建<input>
元素和apply-templates
所有属性。
<xsl:template match="text">
<input>
<xsl:apply-templates select="@*"/>
<label><xsl:value-of select="." /></label>
</input>
</xsl:template>
其次,您要做的是将属性从字面上复制到新文档中,而不是重新创建它们,只是copy
它们,如下所示:
<xsl:template match="text/@*">
<xsl:copy/>
</xsl:template>
所以,这是一个完整的样式表......
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/texts">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="text">
<input>
<xsl:apply-templates select="@*"/>
<label><xsl:value-of select="." /></label>
</input>
</xsl:template>
<xsl:template match="text/@*">
<xsl:copy/>
</xsl:template>
</xsl:stylesheet>
...当应用于此输入 XML 文档时...
<texts>
<text name='text_name' value='text_value'>text_display</text>
<text name='text_name2' value='text_value2'>other_display</text>
</texts>
...给出这个结果 XML
<input name="text_name" value="text_value">
<label>text_display</label>
</input>
<input name="text_name2" value="text_value2">
<label>other_display</label>
</input>