我是XSLT的新手。我有以下XML我尝试从中提取字符串。但是我必须确保没有空字符串,因为接收应用程序不允许空字段。因此,在源XML在描述字段中没有值的情况下,该字段带有角色属性" descRole:audio"并且紧挨着兄弟节点' itemClass'它具有qcode =" icls:video"的角色属性,我想插入一个空格字符。
XML:
<?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>
XSL:
<?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>
不知怎的,这对我不起作用,我不明白为什么。
答案 0 :(得分:1)
您的xsl:if
与xsl:value-of
语句无关......
<xsl:if test=".=''"><xsl:text> </xsl:text></xsl:if>
在这种情况下,.
只是引用当前上下文节点,即模板匹配的文档节点,因此xsl:value-of
的值不相关。
在这种情况下尝试使用变量:
<xsl:variable name="value" select="/d:newsMessage[1]/d:itemSet[1]/d:newsItem[d:itemMeta/d:itemClass/@qcode='icls:video']/d:contentMeta/d:description[@role='descRole:audio']"/>
<xsl:value-of select="$value" />
<xsl:if test="$value=''"> </xsl:if>
答案 1 :(得分:0)
如果要转换大部分未更改的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>