首页 > 解决方案 > 根据xslt中节点的存在与否将节点值分配给变量

问题描述

我正在尝试根据 XML 中是否存在节点将一个变量的值分配给另一个变量,否则将分配另一个节点的值。我知道两个节点的 Xpath。请在下面找到部分 XSL 代码:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="partMetaOriginal" select="book-part-wrapper/book-part[@book-part-type='chapter']/book-part-meta"/>  
<xsl:variable name="person" select="book-part-wrapper/book-part[@book-part-type='part']/body/book-part[@book-part-type='chapter']/book-part-meta"/> 
<xsl:variable name="partMeta"> 
    <xsl:if test="book-part-wrapper/book-part[@book-part-type='part']">
       <xsl:value-of select="$person"/>
    </xsl:if>
</xsl:variable> 

在我的 xsl 的其余部分中使用变量“ partMeta ”的值时,我收到以下错误:

ERROR:  'Could not compile stylesheet'
FATAL ERROR:  'Could not compile stylesheet'
           :Error checking type of the expression 'FilterParentPath(variable-ref(partMeta/result-tree), step("child", 48))'.
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(TransformerFactoryImpl.java:865)
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(TransformerFactoryImpl.java:649)
    at com.molcon.xmlToXSLT.XMLTransform.main(XMLTransform.java:21)
Caused by: Error checking type of the expression 'FilterParentPath(variable-ref(partMeta/result-tree), step("child", 48))'.

Java 版本 - 1.6

PS:我需要一个代码,它可以根据属性' book-part-wrapper/book-part[@book-part-type] '的值的条件为我的变量 partMeta 分配适当的节点值。所以如果值为'chapter',则变量获取变量'partMetaOriginal'的值,否则获取变量'person'的值。此变量用于导航到其他子节点。

标签: javahtmlxmlxsltxslt-1.0

解决方案


下面的代码应该可以工作,不确定这是否是您真正想要的。此外,如果您想测试属性 book-part-type,正确的 xpath 将是 book-part-wrapper/book-part/@book-part-type。您只需要在代码上进行更改。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="partMetaOriginal" select="book-part-wrapper/book-part[@book-part-type='chapter']/book-part-meta"/>  
    <xsl:variable name="person" select="book-part-wrapper/book-part[@book-part-type='part']/body/book-part[@book-part-type='chapter']/book-part-meta"/> 
    <xsl:variable name="partMeta">
        <xsl:choose>
            <xsl:when test="book-part-wrapper/book-part[@book-part-type] = 'chapter'">
                <xsl:value-of select="$partMetaOriginal"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$person"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
        
</xsl:stylesheet>
                

推荐阅读