XSL问题XSL选择特定的字段名称

时间:2011-06-29 16:19:59

标签: c# xml xslt

我想知道是否有人可以帮助我或指出我正确的方向。我现在有 从XML文件返回正确的元素有些麻烦。我只是尝试获取我所拥有的大型XML文件的缩减版本,以便输出另一个XML文件(而不是很多教程所使用的HTML)。

我有XML字段,如:

      <Field name="audio_format" value="" />
      <Field name="camera" value="" />

但是我要在这里列出更多元素,我有一个可以想要包含在视频或音频文件中的所有可想象的元数据。

所以我的问题和问题是我如何在我的XSL中指定要抓取的字段名称,它目前正在抓取标签内的所有内容,这很好但是不对。这就像我的XSL一样。

         <!--MasterClip-->
 <xsl:template match="MasterClip">
    <MasterClip>
        <xsl:apply-templates />
    </MasterClip>
</xsl:template>

<xsl:template match="Field">
    <Field>
        <xsl:attribute name="name">
            <xsl:value-of select="@name" />
        </xsl:attribute>
        <xsl:attribute name="value">
            <xsl:value-of select="@value" />
        </xsl:attribute>
    </Field>

我有大约50个字段然后输出,但是我只想选择我指定的字段(其中10个)。我尝试了一些例子,但大多数都与搜索和排序有关,任何帮助都会很棒。即使只是一个简单的例子,告诉我如何选择其中一个,我可以把它复制出来用于其余的!

由于

3 个答案:

答案 0 :(得分:1)

您可以指定谓词以将模板应用于:

<xsl:apply-templates select="/Field[@name='audio_format' or @name='camera']" />

答案 1 :(得分:1)

您可以直接使用模板匹配:

<xsl:template match="Field[matches(@name,'audio_format|camera')]">
  <xsl:copy-of select="."/>
 </xsl:template>

matches只是一个XSLT 2.0函数。

答案 2 :(得分:0)

这可以通过枚举要复制的字段名称的变量来完成:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="no" />
    <xsl:variable name="fields" select="'|audio_format|camera|'" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="MasterClip">
        <xsl:copy>
            <xsl:apply-templates select=
                "*[contains($fields, concat('|', @name, '|'))]" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

鉴于此输入:

<MasterClip>
    <Field name="audio_format" value="" />
    <Field name="camera" value="" />
    <Field name="some_other_name" value="" />
</MasterClip>

输出:

<MasterClip>
    <Field name="audio_format" value="" />
    <Field name="camera" value="" />
</MasterClip>

注意:此示例使用标识转换来复制Field元素。如果您不想直接复制,则只需创建一个单独的模板来处理这些元素。

另请注意:这与XSLT 1.0兼容。