如何在XML中获取值或创建节点名称(<nodename.variablevalue>)</nodename.variablevalue>

时间:2012-06-06 05:36:12

标签: xml xslt xpath

我有一个这样的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:这是可能的还是仅仅将它用作节点的属性?

1 个答案:

答案 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>