Генерация двух разных выходов для одного и того же файла XSL? - PullRequest
2 голосов
/ 20 июля 2011

Это мой XML-файл, и если я запусту XSLt-файл, я получу тот же вывод в том же порядке точно в Eclipse XSL Transformation.Даже если добавить новую запись в мой xml-файл и запустить XSL-файл, <xsl:value-of select="generate-id(.)"/> создаст уникальный идентификатор для новой записи.

<?xml version="1.0" encoding="UTF-8"?>
<CONTACTS>

<CONTACT>
<Customer-ID>N65539</Customer-ID>
<FirstName>Ben</FirstName>
<LastName>Foden</LastName>
<email></email>
<address></address>
<state>AZ</state>
<country>US</country>
</CONTACT>

<CONTACT>
<Customer-ID>N65539</Customer-ID>
<FirstName>Nimal</FirstName>
<LastName>Anup</LastName>
<email>nimal.anup@gmail.com</email>
<address></address>
<state>TN</state>
<country>IN</country>
</CONTACT>


<CONTACTS>

Это мой обновленный XSLT-файл:

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

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

    <xsl:template match="CONTACT">
<xsl:copy>
    <Customer-ID>
    <xsl:apply-templates select="node()" mode="generate-id"/>
    </Customer-ID>

    <FirstName>
    <xsl:value-of select="FirstName"/> 
    </FirstName>

    <LastName>
    <xsl:value-of select="LastName"/> 
    </LastName>

    <email>
    <xsl:value-of select="email"/> 
    </email>

    <address>
    <xsl:value-of select="address"/> 
    </address>

    <state>
    <xsl:value-of select="state"/> 
    </state>

    <country>
    <xsl:value-of select="country"/> 
    </country>

</xsl:copy>
    </xsl:template>

    <xsl:template match="node()" mode="generate-id">
    <xsl:text>N</xsl:text>
    <xsl:number level="single" count="node()" format="100"/>        
    </xsl:template>

</xsl:stylesheet>

Затем я использовал тот же файл XSLT для функции процессора XSLT в XUL, который получает другой тип ID и вывод.Продолжайте генерировать новый идентификатор для старой записи и для новой записи. Если я добавлю новую запись в XML-файл.

Как создать новый идентификатор только для новой записи?и как я могу иметь тот же шаблон XML моего входного файла для моего выходного файла XML.

Это вывод, который я получаю:

<?xml version="1.0" encoding="UTF-8"?>
<CONTACTS>

<CONTACT><Customer-ID>id0x03e4a620</Customer-ID><FirstName>Ben</FirstName><LastName>Foden</LastName><email></email><address></address><state>AZ</state><country>US</country></CONTACT>

<CONTACT><Customer-ID>id0x03e4ad80</Customer-ID><FirstName>Nimal</FirstName><LastName>Anup</LastName><email>nimal.anup@gmail.com</email><address></address><state>TN</state><country>IN</country></CONTACT>

<CONTACTS>

Это мой Javascript для вызоваФайл XSLT: скрипт вызывает эту функцию после сохранения файла XML.Новая запись будет обновлена ​​так же, как указано во входном XML-файле.

function process()
{

var src = readFile("c:\\idgenerator.xsl");
var parsed = (new DOMParser()).parseFromString(src, "text/xml");
var stylesheet = parsed.documentElement;

var processor = new XSLTProcessor();
processor.importStylesheet(stylesheet );

objXMLDoc = processor.transformToDocument(objXMLDoc);

var serializer = new XMLSerializer();
var prettyString = serializer.serializeToString(objXMLDoc);

saveFile(prettyString, "C:\\mercredi.xml");

} 

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 20 июля 2011

Если generate-id () выдает повторяющиеся результаты в разных прогонах, то это случайность конструкции вашего процессора XSLT, а не поведение, на которое вы можете положиться.

2 голосов
/ 20 июля 2011

Я не знаю, какой процессор XSLT использует Eclipse. По крайней мере, с некоторыми расширениями вы можете настроить процессор, например, в Ксалан или Саксонии. Mozilla / XUL использует Transformiix, по крайней мере по умолчанию. Я где-то читал, что это можно сделать, чтобы использовать саксонский. Разумеется, между разными процессорами XSLT существуют различия.

В спецификации для generate-id () не указано, как должны выглядеть сгенерированные идентификаторы; только то, что они «должны состоять из буквенно-цифровых символов ASCII и должны начинаться с буквенного символа».

Если вы хотите, чтобы XSLT-under-XUL производил идентичные идентификаторы, как в Eclipse, у вас есть несколько вариантов.

1) Вы можете попытаться заставить XUL использовать процессор XSLT, который использует Eclipse. Я не знаю, возможно ли это.

2) Реализуйте собственный шаблон для генерации идентификаторов.

С последним было бы нетрудно имитировать стиль идентификаторов, которые вы получаете в Eclipse, и сделать их стабильными при нескольких запусках и разных процессорах XSLT, если у вас есть некоторые стабильные данные, на которых они основаны.

Например, если порядок ваших записей всегда стабилен (старые записи никогда не будут удалены, или заменены, или заменены), тогда вы можете использовать такой шаблон для генерации идентификаторов:

<xsl:template match="node()" mode="generate-id">
    <xsl:text>N</xsl:text>
    <xsl:number level="any" count="node()" format="00001"/>        
</xsl:template>

Если порядок не стабилен, но имя и фамилия стабильны и уникальны, вы можете использовать

<xsl:template match="node()" mode="generate-id">
   <xsl:value-of select="concat(FirstName, LastName)" />
</xsl:template>
0 голосов
/ 20 июля 2011

generate-id () работает таким образом, вы можете проверить, есть ли Customer-ID в Контакте, прежде чем использовать generate-id (), я думаю ...

<xsl:if test="./Customer-Id=''"> <!-- if the new contact comes with this empty -->
    <Customer-ID>
        <xsl:value-of select="generate-id(.)"/> 
    </Customer-ID>
<xsl:if>
<xsl:if test="not(./Customer-Id='')"> <!-- if the contact comes with Customer-Id -->
    <Customer-ID>
        <xsl:value-of select="Customer-Id"/> 
    </Customer-ID>
<xsl:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...