我有一个这样的XML文件可以使用。
<root>
<ignore>
<child>1</child>
</ignore>
<select.val>
<child>2</child>
</select.val>
</root>
情景1:
我想在&lt; 下获取子节点的值select.val&gt; 。
我可以使用像 /root/select.val/child 这样的xpath来获取它们。问题是&lt; select.val&gt; 可能与另一个xml文件不同..它可能是&lt; select.val2&gt; 表示另一个xml。如果我使用通配符( / root / * / child ),它也会获得&lt;下的值忽略&gt; 。
基本上是这样的 / root / select。* / child
情景2:
我怎么能用xslt生成一个xml文件,我从变量/参数设置 val 。例如,如果变量/参数的值是val3,那么它将生成类似于此的节点。 select.val3&gt; 。
基本上是这样的。的&LT;选择&LT。 value-of select =“$ val”&gt; &GT;
PS:这是可能的还是仅仅将它用作节点的属性?
答案 0 :(得分:2)
一种方法是在xpath中使用 substring 函数,检查符合条件的元素名称
<xsl:apply-templates select="root/*
[substring(local-name(), 1, 7) = 'select.']/child" />
这只会选择子元素,这些元素是名称以选择开头的元素的子元素。
然后可以直接对此进行参数化以检查完全停止后发生的元素的名称
<xsl:apply-templates select="root/*
[substring(local-name(), 1, 7) = 'select.']
[substring-after(local-name(), '.') = $val]/child" />
(其中$ val是包含您要匹配的名称的参数)。
例如,使用以下XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="val" select="'val'" />
<xsl:template match="/">
<xsl:apply-templates select="root/*[substring(local-name(), 1, 7) = 'select.'][substring-after(local-name(), '.') = $val]/child" />
</xsl:template>
<xsl:template match="child">
<xsl:copy-of select="." />
</xsl:template>
</xsl:stylesheet>
当应用于您的示例XML时,输出以下内容
<child>2</child>
如果要使用名称中的参数生成新节点,可以使用带有属性值模板的 xsl:element 选项(使用花括号指定)来设置名称
<xsl:element name="select.{$val}">3</xsl:element>
例如,当 $ val 设置为'val3'时,输出以下内容
<select.val3>3</select.val3>