xslt用于';n';重复元素创建';n';输出
请,你的任何想法,你可能认为作为一个解决方案会有所帮助。我被要求提出xslt样式表,它动态地为n个重复元素创建n个重复元素作为输入。例如,在父元素A下,有许多具有不同值的子元素,但我只需要提取元素1、元素2、…元素的值,并希望得到结果nResultxslt用于';n';重复元素创建';n';输出,xslt,Xslt,请,你的任何想法,你可能认为作为一个解决方案会有所帮助。我被要求提出xslt样式表,它动态地为n个重复元素创建n个重复元素作为输入。例如,在父元素A下,有许多具有不同值的子元素,但我只需要提取元素1、元素2、…元素的值,并希望得到结果nResult 价值1 价值2 价值3 .... n元素数 名称 数字 地址 价值1 价值2 名称 数字 地址 在这里,您可以从更多的模板方法中获益。例如,要将输入元素更改为输出元素,可以使用以下模板: <xsl:template match="input"
价值1
价值2
价值3
.... n元素数
名称
数字
地址
价值1
价值2
名称
数字
地址
在这里,您可以从更多的模板方法中获益。例如,要将输入
元素更改为输出
元素,可以使用以下模板:
<xsl:template match="input">
<output>
<xsl:apply-templates select="@*|node()"/>
</output>
</xsl:template>
您可以使用类似的模板来删除非元素
<xsl:template match="input/*/*[not(starts-with(name(), 'Element'))]" />
注意,通过使用模板优先级,您可以稍微简化这一点,并删除对元素名称的重复检查。尝试用这些模板替换最后两个模板
<xsl:template match="input/*/*[starts-with(name(), 'Element')]" priority="2">
<Result>
<xsl:apply-templates select="@*|node()"/>
</Result>
</xsl:template>
<xsl:template match="input/*/*" />
你的意思是这样的:
XSLT样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="input">
<output>
<xsl:apply-templates>
</xsl:apply-templates>
</output>
</xsl:template>
<xsl:template match="input/*">
<xsl:element name="{name()}">
<xsl:apply-templates></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="input/*/*">
<xsl:if test="contains(name(),'Element')">
<xsl:element name="Result">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
XML示例(您的):
价值1
价值2
价值3
名称
数字
地址
价值1
价值2
名称
数字
地址
结果:
<?xml version="1.0" encoding="UTF-8"?><output>
<A>
<Result>Value1</Result>
<Result>Value2</Result>
<Result>Value3</Result>
</A>
<B>
<Result>Value1</Result>
<Result>Value2</Result>
</B>
</output>
价值1
价值2
价值3
价值1
价值2
在这种情况下,您能显示预期的输出吗?您想要的只是输出中名为“Element…”的元素,还是还需要“name”、“ID”和“address”呢?谢谢我只需要输出中名为“Element”的元素。Sune和Tim,我非常感谢。非常感谢你。工作得很好@阿卜杜勒·卡迪尔:如果有帮助,请回答这个问题。谢谢
<xsl:template match="input/*/*[starts-with(name(), 'Element')]" priority="2">
<Result>
<xsl:apply-templates select="@*|node()"/>
</Result>
</xsl:template>
<xsl:template match="input/*/*" />
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="input">
<output>
<xsl:apply-templates>
</xsl:apply-templates>
</output>
</xsl:template>
<xsl:template match="input/*">
<xsl:element name="{name()}">
<xsl:apply-templates></xsl:apply-templates>
</xsl:element>
</xsl:template>
<xsl:template match="input/*/*">
<xsl:if test="contains(name(),'Element')">
<xsl:element name="Result">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
<input>
<A>
<Element1>Value1</Element1>
<Element2>Value2</Element2>
<Element3>Value3</Element3>
<name>name</name>
<ID>idmumber</ID>
<address>address</address>
</A>
<B>
<Element1>Value1</Element1>
<Element2>Value2</Element2>
<name>name</name>
<ID>idmumber</ID>
<address>address</address>
</B>
</input>
<?xml version="1.0" encoding="UTF-8"?><output>
<A>
<Result>Value1</Result>
<Result>Value2</Result>
<Result>Value3</Result>
</A>
<B>
<Result>Value1</Result>
<Result>Value2</Result>
</B>
</output>