我有以下xml
<TopLevel>
<data m="R263">
<s ut="263firstrecord" lt="2013-02-16T09:21:40.393" />
<s ut="263secondrecord" lt="2013-02-16T09:21:40.393" />
</data>
<data m="R262">
<s ut="262firstrecord" lt="2013-02-16T09:21:40.393" />
<s ut="262secondrecord" lt="2013-02-16T09:21:40.393" />
</data>
</TopLevel>
我有一些XSLT来执行调用模板,但它没有正确地进行迭代。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="data">
<xsl:value-of select="@m" />
<xsl:variable name="vYourName" select="@m"/>
<xsl:choose>
<xsl:when test="@m='R262'">
<xsl:call-template name="R262"/>
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="@m='R263'">
<xsl:call-template name="R263"/>
</xsl:when>
</xsl:choose>
</xsl:template>
<xsl:template name="R262">
<xsl:for-each select="/TopLevel/data/s">
Column1=<xsl:value-of select="@ut" />
Column2=<xsl:value-of select="@lt" />
</xsl:for-each>
</xsl:template>
<xsl:template name="R263">
<xsl:for-each select="/TopLevel/data/s">
Column1=<xsl:value-of select="@ut" />
Column2=<xsl:value-of select="@lt" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
这给了我4个(<s> level)
记录的8个记录。我知道这与我的迭代有关...但我不知道如何解决这个问题。
我也知道应用样式表但我无法解开这个谜......如果有人可以帮助我使用 XSLT,它只处理从<TopLevel>
到<\TopLevel>
的所有内容检查<data>
级别的m的值,并在每个<s>
记录的<s>
级别应用样式表,我将非常有信心。
答案 0 :(得分:1)
我不知道你想要制作什么输出,但我怀疑你想要替换
<xsl:for-each select="/TopLevel/data/s">
通过
<xsl:for-each select="s">
也就是说,您只想处理当前正在处理的“数据”中的“s”元素,而不是选择整个文档中的所有“s”元素。
为什么不使用apply-templates?
<xsl:template match="data">
...
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="s[../@m='R262']">
...
</xsl:template>
<xsl:template match="s[../@m='R263']">
...
</xsl:template>
答案 1 :(得分:0)
如果您想使用match template
和apply-templates
,您可以执行以下操作,这样您就可以像样式表一样提供文本输出。所以这个XSLT应用于原始源XML:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="data">
<xsl:value-of select="@m"/>
<xsl:apply-templates select="s"/>
</xsl:template>
<xsl:template match="s">
Column1=<xsl:value-of select="@ut"/>
Column2=<xsl:value-of select="@lt"/>
</xsl:template>
</xsl:stylesheet>
为您提供此输出:
<?xml version="1.0" encoding="UTF-8"?>
R263
Column1=263firstrecord
Column2=2013-02-16T09:21:40.393
Column1=263secondrecord
Column2=2013-02-16T09:21:40.393
R262
Column1=262firstrecord
Column2=2013-02-16T09:21:40.393
Column1=262secondrecord
Column2=2013-02-16T09:21:40.393
你基本上只匹配s
并给出属性“ut”和“lt”。您还可以输出看起来更好的XML。
使用此XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<root>
<xsl:apply-templates/>
</root>
</xsl:template>
<xsl:template match="data">
<list>
<xsl:apply-templates select="s"/>
</list>
</xsl:template>
<xsl:template match="s">
<xsl:element name="record">
<xsl:attribute name="m">
<xsl:value-of select="parent::data/@m"/>
</xsl:attribute>
<item>Column1=<xsl:value-of select="@ut"/></item>
<item>Column2=<xsl:value-of select="@lt"/></item>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
将为您提供这个不错的XML输出:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<list>
<record m="R263">
<item>Column1=263firstrecord</item>
<item>Column2=2013-02-16T09:21:40.393</item>
</record>
<record m="R263">
<item>Column1=263secondrecord</item>
<item>Column2=2013-02-16T09:21:40.393</item>
</record>
</list>
<list>
<record m="R262">
<item>Column1=262firstrecord</item>
<item>Column2=2013-02-16T09:21:40.393</item>
</record>
<record m="R262">
<item>Column1=262secondrecord</item>
<item>Column2=2013-02-16T09:21:40.393</item>
</record>
</list>
您必须稍微调整原始XSLT以获得良好的XML结构。此外,在匹配s
时,您“爬”到元素data
以获取属性值的R-numbers
。
匹配正确的XML根元素所需的模板root
。 <list>
您也可以摆脱<record>
作为<root>
的孩子{/ 1}}。
我希望这是你的期望,并试着玩弄它!
最好的问候,彼得