Игнорирование тегов XML в XSL - PullRequest
0 голосов
/ 30 июня 2011

У меня вопрос по поводу переводов 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 ]

2 голосов
/ 30 июня 2011

По умолчанию преобразования преобразуют значение любого текстового узла, если нет совпадения с другим правилом шаблона.Вы можете избежать этого, добавив шаблон:

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

Это заменит правило по умолчанию для текста и атрибутов.Это означает, что вам нужно будет явно выбрать значения для текста, который будет выводиться, используя xsl:value-of.

1 голос
/ 30 июня 2011

Согласно вашим комментариям:

Поиск работает, и он возвращает только тот, который я указал, но, очевидно, я не хочу, чтобы <roll> сопровождал вывод.

Посмотрите на эту часть вашего преобразования:

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

Такой шаблон известен как Identity Transformation .Поскольку его задача состоит в том, чтобы скопировать все входные данные на выходные, при использовании его в преобразовании вы должны явно заткнуть нежелательные элементы.Согласно вашим комментариям, если вы не хотите roll, вам нужен шаблон вроде:

<xsl:template match="roll"/>

То есть вы переопределяете идентичность и заставляете преобразование ничего не делать для этого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...