0

私は XSLT の専門家ではないので、ここで助けを求めます。

ここに私のXML入力があります:

<?xml version="1.0" encoding="UTF-8"?>
<Target_Root>
<RecordHeader>
    <FileHeader>1234567</FileHeader>
</RecordHeader>
<TransDetails>
    <TransHeader>
        <FileHeaderRec/>
        <BatchHeaderRec/>
        <OrderingPartyRec/>
        <TransBody>
            <TransactionRec/>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii1 </Description>
                </_0160>
            </DescRec>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii2</Description>
                </_0160>
            </DescRec>
            <NameBenRec/>
            <CityBenRec/>
        </TransBody>
                    <TransBody>
            <TransactionRec/>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii3 </Description>
                </_0160>
            </DescRec>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii4</Description>
                </_0160>
            </DescRec>
            <NameBenRec/>
            <CityBenRec/>
        </TransBody>
    </TransHeader>
    <BatchTrailerRec/>
    <FileTrailerRec/>
</TransDetails>

私の意図した出力は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Target_Root>
<RecordHeader>
    <FileHeader>1234567</FileHeader>
</RecordHeader>
<TransDetails>
    <TransHeader>
        <FileHeaderRec/>
        <BatchHeaderRec/>
        <OrderingPartyRec/>
        <TransBody>
            <TransactionRec/>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii1 Srii2</Description>
                </_0160>
            </DescRec>
            <NameBenRec/>
            <CityBenRec/>
        </TransBody>
        <TransBody>
            <TransactionRec/>
            <DescRec>
                <_0160>
                    <RecordCode>1</RecordCode>
                    <VariantCode>A</VariantCode>
                    <Description>Srii3 Srii4</Description>
                </_0160>
            </DescRec>
            <NameBenRec/>
            <CityBenRec/>
        </TransBody>
    </TransHeader>
    <BatchTrailerRec/>
    <FileTrailerRec/>
</TransDetails>

ご覧のとおり、1 つのコンテキスト ID に該当するセグメントの下に要素の値を連結しようとしています。社内アプリケーションを使用して実行できますが、非常に時間がかかるようです。以前にこの要件に直面した人はいますか? よろしくお願いします。

4

1 に答える 1

0

恒等変換に基づいて構築できます。説明については、コメントを参照してください。

XSLT 1.0の提案:

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

  <!-- Identity transform -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Do nothing for DescRec elements that have a preceding sibling DescRec -->
  <xsl:template match="DescRec[preceding-sibling::DescRec]"/>

  <!-- For Description elements, concatenate the content of all the Description elements
       within the same TransBody context -->
  <xsl:template match="Description">
    <xsl:copy>
      <xsl:for-each select="ancestor::TransBody//Description">
        <xsl:value-of select="."/>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

XSLT 2.0の場合:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <!-- Identity transform -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- Do nothing for DescRec elements that have a preceding sibling DescRec -->
  <xsl:template match="DescRec[preceding-sibling::DescRec]"/>

  <!-- For Description elements, concatenate the content of all the Description elements
       within the same TransBody context -->
  <xsl:template match="Description">
    <xsl:copy>
      <xsl:value-of select="ancestor::TransBody//Description" separator="''"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>
于 2012-12-17T16:09:35.787 に答える