Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT使用标记id解析多个嵌套子级帮助_Xml_Xslt_Global Variables_Children_Nested Attributes - Fatal编程技术网

Xml XSLT使用标记id解析多个嵌套子级帮助

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">

我需要使用XSLT将以下xml解析为名称/值对。不管我怎么做,我都做不好。我知道你不能用一个全局“计数器”来跟踪批处理,但我尝试了递归模板,调用java助手类position(),count,随便你说……我被卡住了

对于包含的所有子元素,“批次”的编号必须相同

以下是我的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>

可以使用XPath
number()
函数重命名批对。例如,XPath
number('0000001')=1
。它们与XPath
concat()
一起将帮助您组装所需的批对

为了处理逗号,我选择了模板模式技术,但您可以根据自己的喜好处理它

[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