忽略XSL中的XML标记

时间:2011-06-30 10:20:19

标签: c# xml xslt

我有一个关于XML翻译的问题,我有一个XML,我将其翻译成另一个XML。 我的xls很简单,只需要我想要的字段。我注意到的是,例如,如果我有1,2,3,4并且在我的xsl中,我只是决定我想要1,3也会有2个。我相信我读到了xsl默认规则,如此:......

我是否需要为每个标签创建规则,甚至是我不想要的标签? 我该如何处理我不想要的? (我尝试了一些东西,但它仍然输出它)。 有关直接XML 2 XML翻译的任何教程或好页面吗?

所有洞察力都很棒,我要去谷歌了。

感谢。

这是我的XSL,因为它目前没有匹配过滤器:

<?xml version="1.0" encoding="windows-1252"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output indent="yes" method="xml" />

    <!--FileImport-->

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

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

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


    <!-- CLip -->
    <xsl:variable name="fields" select="'|clip|number|technical_comments|channel|'" />
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Clip">
        <xsl:copy>
            <xsl:apply-templates select=
                "*[contains($fields, concat('|', @name, '|'))]" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

我的一些XML是

<?xml version="1.0" encoding="windows-1252" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>

<FileImport>
    <Global>
        <GlobalParam name="RollName" value="Scene1" />
        <GlobalParam name="TapeOrg" value="10:00:00:00" />
        <GlobalParam name="ReadStart" value="00:00:00:00" />
        <GlobalParam name="ReadDuration" value="00:02:26:18" />
    </Global>
    <Roll>
        <Field name="ingest_report" value="&lt;?xml version=&quot;1.0&quot;  standalone=&quot;yes&quot;?&gt;&#xD;&#xA;&lt;DataSet1 
        </Roll>
        <Clip>
            <Field name="audio_format" value="" group="Ingest" />
            <Field name="camera_id" value="" group="Ingest" />
        </Clip>

    </FileImport>

希望我的输出看起来像

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="testFIDEF.xsl"?>

<FileImport>
    <Global>
        <GlobalParam name="RollName" value="Scene_Around_Six_Tape_3_BUFVC003-14 10:00:00:00" />
        <GlobalParam name="TapeOrg" value="10:00:00:00" />
        <GlobalParam name="ReadStart" value="00:00:00:00" />
        <GlobalParam name="ReadDuration" value="00:02:26:18" />
    </Global>

    <MasterClip>
        <Field name="clip_description" value="Interview Captain Austin Ardill re Terence O'Neill" group="Ingest" />
        <Field name="rushes_roll_number" value="BUFVC003" group="Ingest" />
        <Field name="source_image_format" value="" group="Ingest" />
        <Field name="technical_comments" value="" group="Ingest" />
    </MasterClip>
</FileImport>

2 个答案:

答案 0 :(得分:2)

默认情况下,如果与其他模板规则不匹配,则转换将超出任何文本节点的值。您可以通过添加模板来避免这种情况:

<xsl:template match="text()|@*" />

这将覆盖文本和属性的默认规则。这意味着您需要使用xsl:value-of明确选择要输出的文本的值。

答案 1 :(得分:1)

根据您的意见:

  

搜索有效,它只返回我指定的那个,但显然我不希望<roll>出现输出。

看看你变换的这一部分:

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

这种模板称为身份转换。因为它的任务是将输入中的所有内容复制到输出中,所以当您在转换中使用它时,必须明确地关闭不需要的元素。根据您的意见,如果您不想roll,则需要一个模板,如:

<xsl:template match="roll"/>

也就是说,你覆盖了身份并使变换不对该元素做任何事情。