2012-06-12 79 views
1

請告訴我如何按字段id分割文檔。例如doc號保存在[@id=0]/field[@id=1]line[@id=0]/field[@id=2]行中,line[@id>0]是保存的代碼和值。如何按字段ID分割文檔?

XML例如:

<document> 
    <sheet id="0" name="Sheet1"> 
     <line id="0"> 
      <field id="0"><![CDATA[Code]]></field> 
      <field id="1"><![CDATA[01]]></field> 
      <field id="2"><![CDATA[02]]></field> 
     </line> 
     <line id="1"> 
      <field id="0"><![CDATA[9772]]></field> 
      <field id="1"><![CDATA[9.0]]></field> 
      <field id="2"><![CDATA[5.0]]></field> 
     </line> 
     <line id="5"> 
      <field id="0"><![CDATA[9771]]></field> 
      <field id="1"><![CDATA[1.0]]></field> 
      <field id="2"/> 
     </line> 
     <line id="1"> 
      <field id="0"><![CDATA[9773]]></field> 
      <field id="1"><![CDATA[8.0]]></field> 
      <field id="2"><![CDATA[4.0]]></field> 
     </line> 
    </sheet>  
</document> 

如果需要的話結果:

<documents> 
    <document> 
     <header> 
      <number>01</number> 
     </heder> 
     <line> 
      <line-item> 
       <lineNumber>1</lineNumber> 
       <Code>9772</Code> 
       <value>9.0</value> 
      </line-item> 
      <line-item> 
       <lineNumber>2</lineNumber> 
       <Code>9771</Code> 
       <value>1.0</value> 
      </line-item> 
      <line-item> 
       <lineNumber>3</lineNumber> 
       <Code>9773</Code> 
       <value>8.0</value> 
      </line-item> 
     </line> 
    </document> 
    <document> 
     <header> 
      <number>02</number> 
     </heder> 
     <line> 
      <line-item> 
       <lineNumber>1</lineNumber> 
       <Code>9772</Code> 
       <value>5.0</value> 
      </line-item> 
      <line-item> 
       <lineNumber>2</lineNumber> 
       <Code>9773</Code> 
       <value>4.0</value> 
      </line-item> 
     </line> 
    </document> 
</documents> 

轉型應XSL工作:樣式版本= 「1.0」

+0

你到目前爲止嘗試過什麼?你可以在這個問題中包含你現在的樣式表,以及它給出的輸出結果嗎? – legoscia

回答

1

嘗試......

解決方案1:程序

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="*" /> 

<xsl:template match="/"> 
<documents> 
    <xsl:apply-templates select="document/sheet/line[@id='0']/field[@id!='0']" /> 
</documents> 
</xsl:template> 

<xsl:template match="field[@id!='0']"> 
<document> 
    <header> 
    <number><xsl:value-of select="." /></number> 
    </header> 
    <line> 
    <xsl:call-template name="line-item-template" > 
    <xsl:with-param name="value-id" select="@id" /> 
    <xsl:with-param name="lines"  select="../../line[@id!='0']"/> 
    </xsl:call-template> 
    </line> 
</document> 
</xsl:template> 

<xsl:template name="line-item-template"> 
<xsl:param name="value-id" /> 
<xsl:param name="lines" /> 
<xsl:for-each select="$lines[field[@id=$value-id]!='']" > 
    <line-item> 
    <lineNumber><xsl:value-of select="format-number(position(),'00')" /></lineNumber> 
    <Code><xsl:value-of select="field[@id='0']" /></Code> 
    <value><xsl:value-of select="field[@id=$value-id]" /></value> 
    </line-item> 
    </xsl:for-each > 
</xsl:template> 

</xsl:stylesheet> 

..或嘗試此...

解決方案2:模板的鄰phile

將該溶液鉤子成涉及到輸出節點的節點。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" indent="yes"/> 

<xsl:template match="*" /> 

<xsl:template match="/"> 
<documents> 
    <xsl:apply-templates select="document/sheet/line[@id='0']/field[@id!='0']" /> 
</documents> 
</xsl:template> 

    <xsl:template match="field[parent::line[@id='0']][@id!='0']"> 
<document> 
    <header> 
    <number><xsl:value-of select="." /></number> 
    </header> 
    <line> 
    <xsl:variable name="value-index" select="@id" /> 
    <xsl:apply-templates select="../../line[@id!='0']/field[@id=$value-index]" /> 
    </line> 
</document> 
</xsl:template> 

<xsl:template match="field[parent::line[@id!='0']][.!='']"> 
    <xsl:variable name="current" select="." /> 
    <xsl:variable name="value-index" select="@id" /> 
    <line-item> 
    <lineNumber><xsl:value-of select="format-number(count(
     preceding::line[field[@id=$value-index]!=''] 
         [..=$current/../..] 
     ),'00')" /></lineNumber> 
    <Code><xsl:value-of select="../field[@id='0']" /></Code> 
    <value><xsl:value-of select="." /></value>  
    </line-item> 
</xsl:template> 

</xsl:stylesheet> 

現在想象一下,解決這一問題的XSLT 2.0。現在,這將是有趣的! :-)

+0

謝謝你的答案。這將是有益的! – Petras