Reputation: 67
I have an XML file with two value: Target_name and Name. Some XML file I receive doesn't have anything in Target name. For instance:
<?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>
The idea is for my XSL to always chose Target_name and fallback to Name. Unfortunately when I have an empty Target_name, my XSL doesn't "take" the value name.
Here's my XSL:
<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>
Here's the result:
{"metadata":[{
"name": "Target_name",
"value": ""
},{
"name": "Source_name",
"value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
},{
"name": "Asset_name",
"value": ""
}]
}
I should have this:
{"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"
}]
}
I'm sure I'm missing something here, I've read many thread here before posting but couldn't figure out that. Thanks for ready me!
Upvotes: 0
Views: 102
Reputation: 117102
always chose Target_name and fallback to Name.
This could be accomplished by a single XPath expression:
(Asset/DescriptiveMetadata/Metadata[@name='Target_name'][text()], Asset/Sources/Source/Name)[1]
Demo: https://xsltfiddle.liberty-development.net/3MP42MB
Upvotes: 1