Xml <;xsl:if测试>;没有按预期工作
我是XSLT新手。我尝试从以下XML中提取字符串。但是我必须确保没有空字符串,因为接收应用程序不允许空字段。因此,如果源XML在带有角色属性“descRole:audio”的description字段中没有值,并且位于具有角色属性qcode=“icls:video”的同级节点“itemClass”的旁边,我想插入一个空白字符 XML:Xml <;xsl:if测试>;没有按预期工作,xml,xslt,Xml,Xslt,我是XSLT新手。我尝试从以下XML中提取字符串。但是我必须确保没有空字符串,因为接收应用程序不允许空字段。因此,如果源XML在带有角色属性“descRole:audio”的description字段中没有值,并且位于具有角色属性qcode=“icls:video”的同级节点“itemClass”的旁边,我想插入一个空白字符 XML: <?xml version="1.0" encoding="UTF-8"?> <newsMessage xmlns="http://iptc.o
<?xml version="1.0" encoding="UTF-8"?>
<newsMessage xmlns="http://iptc.org/std/nar/2006-10-01/">
<itemSet>
<packageItem>
<itemMeta/>
<contentMeta/>
</packageItem>
<newsItem>
<itemMeta>
<itemClass qcode="icls:text"/>
</itemMeta>
<contentMeta>
<description role="descRole:intro" xml:lang="en"></description>
<description role="descRole:moreInfo" xml:lang="en"></description>
</contentMeta>
</newsItem>
<newsItem>
<itemMeta>
<itemClass qcode="icls:video"/>
</itemMeta>
<contentMeta>
<description role="descRole:audio" xml:lang="en">NATURAL</description>
</contentMeta>
</newsItem>
</itemSet>
</newsMessage>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://iptc.org/std/nar/2006-10-01/" version="1.0">
<xsl:template match="/">
<xsl:value-of select="/d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio']"/>
<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>
</xsl:template>
</xsl:stylesheet>
自然的
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<newsMessage xmlns="http://iptc.org/std/nar/2006-10-01/">
<itemSet>
<packageItem>
<itemMeta/>
<contentMeta/>
</packageItem>
<newsItem>
<itemMeta>
<itemClass qcode="icls:text"/>
</itemMeta>
<contentMeta>
<description role="descRole:intro" xml:lang="en"></description>
<description role="descRole:moreInfo" xml:lang="en"></description>
</contentMeta>
</newsItem>
<newsItem>
<itemMeta>
<itemClass qcode="icls:video"/>
</itemMeta>
<contentMeta>
<description role="descRole:audio" xml:lang="en">NATURAL</description>
</contentMeta>
</newsItem>
</itemSet>
</newsMessage>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:d="http://iptc.org/std/nar/2006-10-01/" version="1.0">
<xsl:template match="/">
<xsl:value-of select="/d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio']"/>
<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>
</xsl:template>
</xsl:stylesheet>
不知何故,这对我不起作用,我不明白为什么。您的
xsl:if
与执行它的xsl:value
语句无关
<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>
如果要转换大部分未更改但部分已转换的XML文档,请从标识转换模板开始
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
然后为需要更改的元素添加带有匹配模式的模板,例如
<xsl:template match="d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio'][. = '']">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:text> </xsl:text>
</xsl:copy>
</xsl:template>
这就像一个符咒。谢谢你的解释,现在我明白了。