1

我有一个这样的 XML 文件可以使用。

    <root>
      <ignore>
        <child>1</child>
      </ignore>
      <select.val>
        <child>2</child>
      </select.val>
    </root>

场景一:

我想获取<select.val>下的子节点的值。

我可以使用这样的 xpath 来获取它们/root/select.val/child。问题是<select.val>对于另一个 xml 文件可能不同。它可能是<select.val2>对于另一个 xml。如果我使用通配符(/root/*/child),它也会得到<ignore >下的值。

基本上像这样/root/select.*/child

场景二:

我如何使用 xslt从变量/参数设置val生成 xml 文件。例如,如果变量/参数的值为 val3,那么它将生成一个像这样的节点<select.val3 >

基本上是这样的。 <select.<value-of select="$val" >>

PS:这是可能的还是应该将其用作节点的属性?

4

1 回答 1

2

一种方法是使用 xpath 中的substring函数来检查元素的名称是否符合您的条件

<xsl:apply-templates select="root/*
   [substring(local-name(), 1, 7) = 'select.']/child" />

这只会选择名称以 select 开头的元素的子元素

然后直接参数化它以检查在句号之后出现的元素的名称

<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>
于 2012-06-06T06:31:56.960 回答