Saya memiliki file XML dengan dua nilai: Target_name dan Name. Beberapa file XML yang saya terima tidak memiliki apa pun dalam nama Target. Contohnya:

    <?xml version="1.0" encoding="UTF-8" ?>
<Asset version="1.0">
    <Sources>
        <Source>
            <Name>@Pat Robertson s Prophecy on 2020 US Presidential Election Re</Name>
    </Source>
</Sources>
<DescriptiveMetadata>
    <Metadata source="user" name="Target_name"></Metadata>
</DescriptiveMetadata>
</Asset>

Idenya adalah agar XSL saya selalu memilih Target_name dan mundur ke Name. Sayangnya ketika saya memiliki Target_name kosong, XSL saya tidak "mengambil" nama nilai.

Ini XSL saya:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    exclude-result-prefixes="xs math"
    version="3.0">
   <xsl:output method="xml" indent="yes" encoding="UTF-8" />

    <!--CLEAN SOURCE NAME-->

        <xsl:variable name="Clean_source_name">
             <xsl:value-of select="replace(Asset/Sources/Source/Name, '[^a-zA-Z0-9_. ]', '')"/>
        </xsl:variable> 

    <!--WHEN DESCRIPTIVE TARGET NAME OTHERWISE CLEAN SOURCE NAME-->
    <xsl:variable name="Asset_name">
        <xsl:choose>
         <xsl:when test="Asset/DescriptiveMetadata/Metadata[@name='Target_name']">
           <xsl:value-of select="Asset/DescriptiveMetadata/Metadata[@name='Target_name']" />
         </xsl:when>
         <xsl:otherwise>
          <xsl:value-of select="$Clean_source_name"/>
         </xsl:otherwise>
       </xsl:choose>
    </xsl:variable>

    <!--CONSTRUCTION JSON DE SORTIE--> 
       <xsl:template match="/">

                <xsl:text>{"metadata":[</xsl:text>
                <xsl:for-each select="/Asset/DescriptiveMetadata/Metadata">
                <xsl:text>{
                    "name": "</xsl:text>
                <xsl:value-of select="./@name"/>
                <xsl:text>",
                    "value": "</xsl:text>
                <xsl:value-of select="."/>
                                <xsl:text>"
                }</xsl:text>
                <xsl:if test="position() != last()">,</xsl:if>
                </xsl:for-each>
                <xsl:text>,{
                    "name": "Source_name",</xsl:text>
                    <xsl:text>
                    "value": "</xsl:text>
                <xsl:value-of select="$Clean_source_name" />
                <xsl:text>"
                                },{
                    "name": "Asset_name",</xsl:text>
                    <xsl:text>
                    "value": "</xsl:text>
                <xsl:value-of select="$Asset_name" />
                <xsl:text>"
                                 }]
                }</xsl:text>      
     </xsl:template>
</xsl:stylesheet> 

Berikut hasilnya:

{"metadata":[{
                    "name": "Target_name",
                    "value": ""
                },{
                    "name": "Source_name",
                    "value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
                                },{
                    "name": "Asset_name",
                    "value": ""
                                 }]
                }

Saya harus memiliki ini:

{"metadata":[{
                    "name": "Target_name",
                    "value": ""
                },{
                    "name": "Source_name",
                    "value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
                                },{
                    "name": "Asset_name",
                    "value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
                                 }]
                }

Saya yakin saya kehilangan sesuatu di sini, saya sudah membaca banyak utas di sini sebelum memposting tetapi tidak dapat mengetahuinya. Terima kasih sudah siap saya!

0
Brice 23 April 2021, 03:23

1 menjawab

Jawaban Terbaik

selalu pilih Target_name dan mundur ke Name.

Ini dapat dicapai dengan ekspresi XPath tunggal:

(Asset/DescriptiveMetadata/Metadata[@name='Target_name'][text()], Asset/Sources/Source/Name)[1]

Demo: https://xsltfiddle.liberty-development.net/3MP42MB

1
michael.hor257k 23 April 2021, 10:23