否则 XSL 条件
XSL condition when otherwise
我有一个包含两个值的 XML 文件:Target_name 和名称。我收到的某些 XML 文件在目标名称中没有任何内容。例如:
<?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>
我的想法是让我的 XSL 始终选择 Target_name 并回退到名称。不幸的是,当我有一个空 Target_name 时,我的 XSL 不会“采用”值名称。
这是我的 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>
结果如下:
{"metadata":[{
"name": "Target_name",
"value": ""
},{
"name": "Source_name",
"value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
},{
"name": "Asset_name",
"value": ""
}]
}
我应该有这个:
{"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"
}]
}
我确定我在这里遗漏了一些东西,我在发帖之前已经阅读了很多主题,但无法弄清楚。谢谢你让我准备好!
always chose Target_name and fallback to Name.
这可以通过单个 XPath 表达式来完成:
(Asset/DescriptiveMetadata/Metadata[@name='Target_name'][text()], Asset/Sources/Source/Name)[1]
我有一个包含两个值的 XML 文件:Target_name 和名称。我收到的某些 XML 文件在目标名称中没有任何内容。例如:
<?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>
我的想法是让我的 XSL 始终选择 Target_name 并回退到名称。不幸的是,当我有一个空 Target_name 时,我的 XSL 不会“采用”值名称。
这是我的 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>
结果如下:
{"metadata":[{
"name": "Target_name",
"value": ""
},{
"name": "Source_name",
"value": "Pat Robertson s Prophecy on 2020 US Presidential Election Re"
},{
"name": "Asset_name",
"value": ""
}]
}
我应该有这个:
{"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"
}]
}
我确定我在这里遗漏了一些东西,我在发帖之前已经阅读了很多主题,但无法弄清楚。谢谢你让我准备好!
always chose Target_name and fallback to Name.
这可以通过单个 XPath 表达式来完成:
(Asset/DescriptiveMetadata/Metadata[@name='Target_name'][text()], Asset/Sources/Source/Name)[1]