1

我想加入两个没有唯一 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

请帮我!:-)

4

2 回答 2

0

如果“DTs”中的“DT”元素位置与“TMs”中的“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>
于 2013-08-01T16:30:54.693 回答
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>
于 2013-08-01T19:16:01.903 回答