我试图从XML中获取数据,使用类似过滤XSL中XML参数中列出的字段: 参数是像这样的xml:
<Catalog name="Catalog1">
<Fields>
<Field>ID</Field>
<Field>Name</Field>
<Field>Description</Field>
</Fields>
</Catalog>
所以我需要从另一个XML中检索这些元素,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Nodes>
<Node>
<Data>
<Attribute name="ID">Desktop</Attribute>
<Attribute name="Parent">administrator</Attribute>
<Attribute name="Name">Desktop</Attribute>
<Attribute name="Description">Desktop folder</Attribute>
</Data>
<Relationship>
<RelatedNodes>
<Node>
<Data>
<Attribute name="ID">administrator</Attribute>
<Attribute name="Parent"></Attribute>
<Attribute name="Name">administrator</Attribute>
<Attribute name="Description">administrator folder</Attribute>
</Data>
</Node>
</RelatedNodes>
</Relationship>
</Node>
</Nodes>
到目前为止我所拥有的是像这样的XSL模板:
<?xml version="1.0"?>
<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' >
<xsl:output method='text' encoding="UTF-8"/>
<xsl:param name="Fields"> <!--type="xml"--></xsl:param>
<xsl:template match="/">
{
<xsl:apply-templates select="//Data[Attribute[@name='Parent']='' ]/parent::Node" />
}
</xsl:template>
<xsl:template match="Node" >
"children":[
{
<xsl:for-each select="$Fields/Catalog/Fields/Field">
<xsl:variable name="AttributeName" select="." />
"<xsl:value-of select="$AttributeName"/>": " <xsl:value-of select="Data/Attribute[@name=$AttributeName]" /> ",
</xsl:for-each>
<xsl:apply-templates select="ancestor::Node[1]"/>
}
]
</xsl:template>
</xsl:stylesheet>
但是没有工作,xpath没有得到价值,我认为这是因为我必须设置&#34;&#39;&#34; xpath过滤器中的字符,这就是为什么我使用concat但是concat只是将xpath作为字符串返回给我,任何想法?,结果应该是这样的:
{
"children":[
{
"ID": "1",
"Name": "Name1",
"Description: "Desc1",
}
]
}
谢谢!
答案 0 :(得分:1)
因为你只是表现出问题的一部分我只能猜测。 似乎您的XML中有一些数据/属性条目。要访问它们,你不应该像你一样在你的选择中使用concat。
尝试类似:
<xsl:for-each select="$Fields/Catalog/Fields/Field">
<xsl:variable name="name" select="." />
"<xsl:value-of select="."/>": " <xsl:value-of select="//Data/Attribute[@name= $name]" /> ",
</xsl:for-each>
答案 1 :(得分:0)
如果您的动态路径仅包含元素名称,则可以使用
*[name()=$path]
如果它们是更通用的路径,那么您需要一个函数来评估作为字符串动态提供的XPath表达式。在XSLT 3.0之前,标准中没有这样的功能,但是许多XSLT处理器都有一个合适的扩展功能,通常称为xx:evaluate(),其中xx是一些供应商前缀。