感谢那些愿意回复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)
答案 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()
。