2011-07-20 88 views
2

这是我的XML文件,如果我运行XSLt文件,我会在Eclipse XSL转换中以相同的顺序得到相同的输出。 即使向我的xml文件添加新记录并运行XSL文件,<xsl:value-of select="generate-id(.)"/>也会为新记录创建唯一标识。为同一个XSL文件生成两个不同的输出?

<?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>[email protected]</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> 

然后我用于XUL XSLT处理器功能,我发现了一种不同类型的ID和相同的输出的XSLT文件。 它不断为旧记录和新记录生成一个新ID如果我在XML文件中添加一条新记录。

如何为新记录生成新的ID?以及如何将我的输入文件的相同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>[email protected]</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"); 

} 

非常感谢。

+0

我仍在努力了解您要求的内容。您已经显示了实际的输出(来自XUL下的XSLT处理器);你想要的输出是什么?是否希望XUL下的XSLT处理器输出与Eclipse下的XSLT相同的生成ID? – LarsH

+0

第一个XML文件是Eclipse中XSLT文件的实际输出,这是我所需的输出。第二个XML文件是XUL下的XSLT处理器的输出。我的问题是为什么它会生成两种不同类型的输出?来自同一个XSLT文件。 – linguini

+0

@LarsH:可能是Eclipse使用xsl.jaxp,而XUL使用XSLT处理器。有什么区别吗? – linguini

回答

2

我不知道Eclipse使用的XSLT处理器。至少在某些扩展中,您可以配置处理器,例如到Xalan或撒克逊。 Mozilla/XUL至少默认使用Transformiix。我在某处读到可以使用撒克逊语的地方。 不同的XSLT处理器之间肯定存在差异。

generate-id()的规范没有说明生成的ID应该是什么样的;只有它们“必须由ASCII字母数字字符组成并且必须以字母字符开头”。

如果您希望XSLT-under-XUL能够生成与Eclipse下相同类型的ID,那么您有几个选项。

1)您可以尝试让XUL使用Eclipse使用的XSLT处理器。我不知道这是否可能。

2)实现您自己的自定义模板以生成ID。如果你有一些稳定的数据来处理它们,那么使用后者就不难模仿你在Eclipse中获得的ID的风格,并且使它们在多次运行和不同的XSLT处理器中保持稳定。

例如,如果您的订单记录始终是稳定的(旧的记录将永远不会被删除或替换,或替换),那么你可以使用一个模板,这样生成的ID:

<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

是正确的吗? N linguini

+0

是的,没错,虽然您需要确保您''和''和''的标签之间没有空格。否则,这些空格将成为ID的一部分。 – LarsH

+0

我完全按照你提到的方式,但它不工作。 – linguini

0

产生-ID()这样工作,你可以使用产生-ID()我觉得之前验证是否有在联系是一个以客户为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> 
+0

您的功能从旧记录中删除,并在中生成一个新记录的ID。 – linguini

+0

是的,没有完成...'你可以复制旧的值,如果它已经存在'...对不起,我不想混淆... – cuq

+0

上面的XSLT代码工程文件,但你忘了关闭循环。感谢您的支持。 – linguini

3

如果generate- id()在不同的运行中产生可重复的结果,那么这是XSLT处理器设计的一个偶然,而不是你可以依赖的行为。

相关问题