Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml <;xsl:if测试>;没有按预期工作_Xml_Xslt - Fatal编程技术网

Xml <;xsl:if测试>;没有按预期工作

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

我是XSLT新手。我尝试从以下XML中提取字符串。但是我必须确保没有空字符串,因为接收应用程序不允许空字段。因此,如果源XML在带有角色属性“descRole:audio”的description字段中没有值,并且位于具有角色属性qcode=“icls:video”的同级节点“itemClass”的旁边,我想插入一个空白字符

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>
<?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>

这就像一个符咒。谢谢你的解释,现在我明白了。