加入两个没有ID的节点

时间:2013-08-01 15:33:22

标签: xml xslt

我想加入两个没有唯一ID的节点。

我看到的示例需要一个唯一的ID或类似字段,但在我的情况下,这是不可能的。我想其他可能性存在,但我找不到它们。

这是来自SOAP服务器的XML响应:

<REGRI Y="2013" RD="2013-05-29" RN="47913">
    <DTs>
        <DT>
            <D DD="2012-12-31" TC="BILANCIO ABBREVIATO D'ESERCIZIO">
                <ADD TC="atto depositato" SD="2013-05-29"/>
            </D>
        </DT>
        <DT>
            <D DD="2013-04-29" TC="COMUNICAZIONE ELENCO SOCI">
                <ADD TC="atto iscritto" ID="2013-05-30"/>
            </D>
        </DT>
    </DTs>

    <TMs>
        <TM TC="B" TD="DEPOSITO DI BILANCI D'ESERCIZIO ED ELENCO DEI SOCI"/>
        <TM TC="S" TD="ELENCO SOCI E TITOLARI DI DIRITTI SU AZIONI O QUOTE SOCIALI"/>
    </TMs>
</REGRI>

这是我的代码:

<xsl:for-each select="p:AF/p:HI/p:REGsRI/p:REGRI">
    <xsl:for-each select="p:DTs/p:DT">
        <p><xsl:value-of select="p:D/@TC" /></p>
        <p><xsl:value-of select="p:D/p:ADD/@TC" /></p>
        <p><xsl:value-of select="p:D/p:ADD/@SD" /></p>
    </xsl:for-each>
    <xsl:for-each select="p:TMs/p:TM">
        <xsl:value-of select="@TC" />-<xsl:value-of select="@TD" />
</xsl:for-each>

这是输出:

BILANCIO ABBREVIATO D'ESERCIZIO
atto depositato
2013-05-29

COMUNICAZIONE ELENCO SOCI
atto iscritto
2013-05-30

B-DEPOSITO DI BILANCI D'ESERCIZIO ED ELENCO DEI SOCI
S-ELENCO SOCI E TITOLARI DI DIRITTI SU AZIONI O QUOTE SOCIALI

我需要显示:

B-DEPOSITO DI BILANCI D'ESERCIZIO ED ELENCO DEI SOCI
BILANCIO ABBREVIATO D'ESERCIZIO
atto depositato
2013-05-29

S-ELENCO SOCI E TITOLARI DI DIRITTI SU AZIONI O QUOTE SOCIALI
COMUNICAZIONE ELENCO SOCI
atto iscritto
2013-05-30

请帮帮我! : - )

2 个答案:

答案 0 :(得分:0)

如果“DT”中的“DT”元素位置与“TM”中的“TM”元素位置相同,则可以执行以下操作:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/REGRI">
        <html>
            <head></head>
            <body>
                <xsl:apply-templates select="TMs/TM"/>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="TM">
        <xsl:variable name="tm_pos" select="position()"/>
        <p>
            <xsl:value-of select="concat(@TC, '-', @TD)"/>
            <br/>
            <xsl:apply-templates select="../preceding-sibling::node()/DT[$tm_pos]"/>
        </p>
    </xsl:template>

    <xsl:template match="DT">
        <xsl:value-of select="D/@TC"/>
        <br/>
        <xsl:value-of select="D/ADD/@TC"/>
        <br/>
        <xsl:choose>
            <xsl:when test="D/ADD/@SD">
                <xsl:value-of select="D/ADD/@SD"/>
            </xsl:when>
            <xsl:when test="D/ADD/@ID">
                <xsl:value-of select="D/ADD/@ID"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>N/A</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

您可以使用position()

<xsl:template match="p:REGRI">
  <xsl:apply-templates select="p:TMs/p:TM" />
</xsl:template>

<xsl:template match="p:TM">
  <xsl:variable name="currpos" select="position()" />
  <xsl:variable name="D" select="ancestor::p:REGRI/p:DTs/p:DT[$currpos]/p:D" />

  <p><xsl:value-of select="concat(@TC, '-', @TD)" /></p>
  <p><xsl:value-of select="$D/@TC" /></p>
  <p><xsl:value-of select="$D/p:ADD/@TC" /></p>
  <p><xsl:value-of select="$D/p:ADD/@SD" /></p>
</xsl:template>

给出

<p>B-DEPOSITO DI BILANCI D'ESERCIZIO ED ELENCO DEI SOCI</p>
<p>BILANCIO ABBREVIATO D'ESERCIZIO</p>
<p>atto depositato</p>
<p>2013-05-29</p>

<p>S-ELENCO SOCI E TITOLARI DI DIRITTI SU AZIONI O QUOTE SOCIALI</p>
<p>COMUNICAZIONE ELENCO SOCI</p>
<p>atto iscritto</p>
<p>2013-05-30</p>