如何解析来自xsl中另一个节点的一个节点的节点值?

时间:2011-11-28 11:22:35

标签: parsing xslt

感谢那些愿意回复bcoz的人,我很乐意,但没有运气&我也是XSL的新手。 提供XML

<Parameterdef>
<Anode>
    <Anodeid>1</Anodeid>
</Anode>
<Bnode>
    <Bnodeid>2</Bnodeid>
</Bnode>
<ParameterVisualization>
    <ParameterDefinition>
        <ParameterSection>Anode</ParameterSection>
        <Parameter>Anodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Bnode</ParameterSection>
        <Parameter>Bnodeid</Parameter> 
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Cnode</ParameterSection>
        <Parameter>Cnodeid</Parameter> 
    </ParameterDefinition>
</ParameterVisualization>
</Parameterdef>

取决于节点值,我必须解析孔xml,如果该节点存在,则需要获取该节点的值。

需要OutPut: 1,2,N / A(因为没有定义Cnode)

2 个答案:

答案 0 :(得分:0)

XPath函数name()local-name()可用于读取未知元素的名称。然后将它们与谓词中的元素值进行比较。我假设您的示例代码中的行</MLinkParameterDefinition>是输入错误,而</ParameterDefinition>则代之。在此解决方案中,<ParameterSection><Parameter>必须具有与元素匹配的值,它还会检查id元素的值是否必须为非空。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:apply-templates select="*/ParameterVisualization/ParameterDefinition"/>
</xsl:template>

<xsl:template match="ParameterDefinition">
    <xsl:variable name="nodeId" select="/*/*[local-name() = current()/ParameterSection]
                                            /*[local-name() = current()/Parameter]
                                              [normalize-space()]"/>
        <xsl:choose>
            <xsl:when test="$nodeId">
                <xsl:value-of select="$nodeId"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>N/A</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="following-sibling::ParameterDefinition">
            <xsl:text>,</xsl:text>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

使用(固定)样本输入

输出
1,2,N/A

逗号之间没有空格,最后一个值之后没有逗号。

不知何故,我觉得应该在这些匹配问题中使用密钥,但对我来说,这似乎是解决问题的一种更直接的方法。

答案 1 :(得分:0)

这个简短的转型

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="ParameterDefinition">
   <xsl:variable name="vThis" select="."/>
     <xsl:variable name="vRes" select=
      "/*/*[name()=$vThis/ParameterSection]
                   /*[name()=$vThis/Parameter]
   "/>

   <xsl:if test="not(position()=1)">,</xsl:if>
   <xsl:value-of select=
     "concat($vRes,
             substring('N/A',
                       1 div (string-length($vRes) = 0)
                       )
             )"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

应用于(更正的)提供的XML文档

<Parameterdef>
<Anode>
    <Anodeid>1</Anodeid>
</Anode>
<Bnode>
    <Bnodeid>2</Bnodeid>
</Bnode>
<ParameterVisualization>
    <ParameterDefinition>
        <ParameterSection>Anode</ParameterSection>
        <Parameter>Anodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Bnode</ParameterSection>
        <Parameter>Bnodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Cnode</ParameterSection>
        <Parameter>Cnodeid</Parameter>
    </ParameterDefinition>
</ParameterVisualization>
</Parameterdef>

生成想要的正确结果

1,2,N/A

<强>解释

使用标准XPath函数 name()