Xml XSLT使用标记id解析多个嵌套子级帮助
我需要使用XSLT将以下xml解析为名称/值对。不管我怎么做,我都做不好。我知道你不能用一个全局“计数器”来跟踪批处理,但我尝试了递归模板,调用java助手类position(),count,随便你说……我被卡住了 对于包含的所有子元素,“批次”的编号必须相同 以下是我的XML代码片段:Xml XSLT使用标记id解析多个嵌套子级帮助,xml,xslt,global-variables,children,nested-attributes,Xml,Xslt,Global Variables,Children,Nested Attributes,我需要使用XSLT将以下xml解析为名称/值对。不管我怎么做,我都做不好。我知道你不能用一个全局“计数器”来跟踪批处理,但我尝试了递归模板,调用java助手类position(),count,随便你说……我被卡住了 对于包含的所有子元素,“批次”的编号必须相同 以下是我的XML代码片段: <extendedDataElements name="Feed" type="string"> <children name="fileId" type="string">
<extendedDataElements name="Feed" type="string">
<children name="fileId" type="string">
<values>TXT123</values>
</children>
<children name="processedTime" type="dateTime">
<values>2011-07-08T20:15:38</values>
</children>
<children name="batch" type="string">
<values>0000001</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="batch" type="string">
<values>0000002</values>
<children name="statusCode" type="string">
<values>start</values>
</children>
</children>
<children name="batch" type="string">
<values>0000003</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="count" type="long">
<values>26</values>
</children>
<children name="value" type="double">
<values>83171.650</values>
</children>
</extendedDataElements>
可以使用XPath
number()
函数重命名批对。例如,XPathnumber('0000001')=1
。它们与XPathconcat()
一起将帮助您组装所需的批对
为了处理逗号,我选择了模板模式技术,但您可以根据自己的喜好处理它
[XSLT1.0]
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/*">
<xsl:apply-templates select="children"/>
</xsl:template>
<xsl:template match="children[not(@name='batch')]">
<xsl:value-of select="concat(
@name,'=',values)"/>
<xsl:apply-templates select="self::*[following-sibling::*]"
mode="comma"/>
</xsl:template>
<xsl:template match="children[@name='batch']">
<xsl:value-of select="concat(
@name,number(values),'=',values,', ',
children/@name,number(values),'=',children/values)"/>
<xsl:apply-templates select="self::*[following-sibling::*]"
mode="comma"/>
</xsl:template>
<xsl:template match="children" mode="comma">
<xsl:value-of select="', '"/>
</xsl:template>
</xsl:stylesheet>
此转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="children">
<xsl:if test="not(position()=1)">, </xsl:if>
<xsl:value-of select="concat(@name,'=',values)"/>
</xsl:template>
<xsl:template match="children[@name='batch']">
<xsl:variable name="vNum">
<xsl:number count="children[@name='batch']" level="single"/>
</xsl:variable>
<xsl:if test="not(position()=1)">, </xsl:if>
<xsl:value-of select="concat('batch', $vNum, '=', values)"/>
<xsl:apply-templates select="children"/>
</xsl:template>
<xsl:template match=
"children[@name='batch']/children">
<xsl:variable name="vNum">
<xsl:for-each select="..">
<xsl:number count="children[@name='batch']" level="single"/>
</xsl:for-each>
</xsl:variable>
<xsl:value-of select=
"concat(', ',@name,$vNum,'=',values)"/>
</xsl:template>
</xsl:stylesheet>
<extendedDataElements name="Feed" type="string">
<children name="fileId" type="string">
<values>TXT123</values>
</children>
<children name="processedTime" type="dateTime">
<values>2011-07-08T20:15:38</values>
</children>
<children name="batch" type="string">
<values>0000001</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="batch" type="string">
<values>0000002</values>
<children name="statusCode" type="string">
<values>start</values>
</children>
</children>
<children name="batch" type="string">
<values>0000003</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="count" type="long">
<values>26</values>
</children>
<children name="value" type="double">
<values>83171.650</values>
</children>
</extendedDataElements>
fileId=TXT123, processedTime=2011-07-08T20:15:38, batch1=0000001, statusCode1=new, batch2=0000002, statusCode2=start, batch3=0000003, statusCode3=new, count=26, value=83171.650
说明:正确使用以下基本XSLT功能:
好问题,+1。有关使用模板、模式匹配和
说明的简短而简单的解决方案,请参见我的答案。:)+1似乎并不完全适用于我的xml,但我从您的模板中学到了很多。非常感谢。
<extendedDataElements name="Feed" type="string">
<children name="fileId" type="string">
<values>TXT123</values>
</children>
<children name="processedTime" type="dateTime">
<values>2011-07-08T20:15:38</values>
</children>
<children name="batch" type="string">
<values>0000001</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="batch" type="string">
<values>0000002</values>
<children name="statusCode" type="string">
<values>start</values>
</children>
</children>
<children name="batch" type="string">
<values>0000003</values>
<children name="statusCode" type="string">
<values>new</values>
</children>
</children>
<children name="count" type="long">
<values>26</values>
</children>
<children name="value" type="double">
<values>83171.650</values>
</children>
</extendedDataElements>
fileId=TXT123, processedTime=2011-07-08T20:15:38, batch1=0000001, statusCode1=new, batch2=0000002, statusCode2=start, batch3=0000003, statusCode3=new, count=26, value=83171.650