1

ドキュメントをフィールドIDで分割する方法を教えてください。たとえば、ドキュメント番号は行に保存され、、[@id=0]/field[@id=1]line[@id=0]/field[@id=2]line[@id>0]コードと値が保存されます。

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:stylesheet version="1.0"で機能するはずです

4

1 に答える 1

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: テンプレート愛好家

このソリューションは、出力ノードに関連するノードにフックします。

<?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 でこの問題を解決することを想像してみてください。今、それは楽しいでしょう!:-)

于 2012-06-12T14:37:00.230 に答える