Mám tento xml s vnoreným prvkom, ktorý je voliteľný, a musím vytvoriť súbor CSV s atribútmi z hierarchie, aj keď voliteľný atribút nie je prítomný.
tu je dátový súbor xml:
<dataroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mycomp.com/test/xml/model">
<ELEMENTS>
<COUNTRY cod_cnt="030">
<AS cod_as="030308">
<CONTRACT num_CONTRACT="8715167"/>
<CONTRACT num_CONTRACT="8715224"/>
</AS>
<AS cod_as="030309"/>
</COUNTRY>
</ELEMENTS>
</dataroot>
Potrebujem prvky, ktoré majú značku AS, aj keď má ZMLUVU alebo nie. „Napísal som niečo také, ale zasekol som sa:
<xsl:for-each select="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS/doc:CONTRACT">
<xsl:value-of select="../../@cod_cnt"/>@<xsl:value-of select="../@cod_as"/>
@<xsl:value-of select="@num_CONTRACT"/>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D<xsl:text> </xsl:text>
</xsl:for-each>
Viem, že mi chýba akýsi zväzok, ale nemôžem ísť ďalej.
Očakávam tento výstup:
030@030308@8715167@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D
030@030308@8715224@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D
030@030309@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D
všimnite si, že prvé dva riadky sú výstupom, ktorý som získal s pripojenými xls a tretí riadok je ručne napísaný, aby som vám ukázal výstup, ktorý očakávam.
odpovede:
0 pre odpoveď č. 1Ak si ťa chcete nechať for-each
štruktúra, mali by pre vás fungovať nasledujúce vyhlásenia. Najprv musíte iterovať doc:AS
potom ďalej doc:CONTRACT
Ak nejaký.
<xsl:for-each select="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS">
<xsl:value-of select="../@cod_cnt"/><xsl:text>@</xsl:text><xsl:value-of select="@cod_as"/>
<xsl:for-each select="doc:CONTRACT>
<xsl:text>@</xsl:text><xsl:value-of select="@num_CONTRACT"/>
</xsl:for-each>
<xsl:text>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D</xsl:text>
</xsl:for-each>
Ale osobne radšej používam porovnávanie šablón a toto vo vašom prípade dá niečo také (netestované):
<xsl:template match="/">
<!-- Select the <doc:AS> if they are your "rows" in the csv output -->
<xsl:apply-template match="/doc:dataroot/doc:ELEMENTS/doc:COUNTRY/doc:AS"/>
</xsl:template>
<xsl:template match="doc:AS">
<!-- Do the job for the doc:AS -->
<xsl:value-of select="../@cod_cnt"/><xsl:text>@</xsl:text><xsl:value-of select="@cod_as"/>
<!-- Call template for doc:Contract if any -->
<xsl:apply-templates select="doc:Contract"/>
<!-- Then add the end of your row -->
<xsl:text>@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@D</xsl:text>
</xsl:template>
<xsl:template match="doc:CONTRACT">
<!-- Do the job for doc:CONTRACT-->
<xsl:text>@</xsl:text><xsl:value-of select="@num_CONTRACT"/>
</xsl:template>