开发者

XSL Question XSL selecting specific field names

开发者 https://www.devze.com 2023-03-16 10:31 出处:网络
I wonder if anyone can help me or point me in the right direction. I am currently having some trouble returning the right elements from an XML file. I am Simply just try to obtain a cut down version

I wonder if anyone can help me or point me in the right direction. I am currently having some trouble returning the right elements from an XML file. I am Simply just try to obtain a cut down version of a large XML file that I have so its outputting another XML file (not HTML which a lot of tutorials are on).

I have XML fields like:

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

However I have many more elements to many to list here , I have one for everything imaginable metadata that you would want to include in a Video or audio file.

So my question and problem is how do I specify in my XSL which Field names to grab , it is currently grabbing everything within the tags, which is good but its not right.Here as a bit of my 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>

I have abou开发者_如何学编程t 50 fields then outputting , however I only want to select ones I specify (10 of them) . I have tried a few examples but most relate to searching and sorting, any help would be great. Even just a quick example showing me how to select one of them and i can just replicate it out for the rest!.

Thanks


You can use template match directly:

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

Where matches is just an XSLT 2.0 function.


You can specify predicates to apply templates to:

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


This can be done quite generically using a variable that enumerates the names of the fields to be copied:

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

Given this input:

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

Output:

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

Note: This example uses the identity transform to copy the Field elements. If you don't want a direct copy, then simply create a separate template for handling those elements.

Note also: This is XSLT 1.0 compatible.

0

精彩评论

暂无评论...
验证码 换一张
取 消