在 XSLT 1.0 中生成 UUID
Generating UUID in XSLT 1.0
在我们的遗留项目中,我们使用基于 xslt 1.0
版本的 libxslt
。
现在需要使用 xslt 文件生成 UUID,以便我们的输出 xml 文件包含 UUID。
根据
我运气不好。
也按照这个https://gist.github.com/azinneera/778f69ae6b0049b5edcd69da70072405
我们可以生成 UUID,但是使用 xslt 2.0.
我是 xslt 的新手,有什么方法可以将 https://gist.github.com/azinneera/778f69ae6b0049b5edcd69da70072405 样式 sheet 从 2.0 版转换为 1.0 版,或者有其他方法可以使用 xslt 1.0 生成 UUID 吗?
正如我在对您的问题的评论中所述,如果您使用的是 libxslt
处理器,则可以使用 EXSLT math:random()
扩展函数生成一个随机数序列,这些随机数最终将形成版本 4 UUID。
这是一个实现示例:
XSLT 1.0 + EXSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://exslt.org/math"
xmlns:func="http://exslt.org/functions"
xmlns:my="www.example.com/my"
extension-element-prefixes="func math my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<func:function name="my:UUID4">
<!-- https://www.ietf.org/rfc/rfc4122.txt -->
<func:result>
<!-- 8 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 4 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<!-- version identifier -->
<xsl:text>-4</xsl:text>
<!-- 3 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 1* -->
<xsl:value-of select="substring('89ab', floor(4*math:random()) + 1, 1)" />
<!-- 3 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 12 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
</func:result>
</func:function>
<xsl:template match="/items">
<output>
<xsl:for-each select="item">
<item id="{my:UUID4()}">
<xsl:value-of select="." />
</item>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
应用于以下输入时:
XML
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
</items>
我得到以下结果:
结果 1
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="77587d4c-1ef6-4aaf-9f97-398dee70fa25">1</item>
<item id="148e4218-c881-41d3-af61-cab4b5d0251f">2</item>
<item id="3a02b568-3200-46ff-993c-3bea9724d6ce">3</item>
<item id="28de29bd-39f4-4eed-979a-765c290652a1">4</item>
<item id="7c767fa7-c0b7-4187-9f86-d3876ec1be8a">6</item>
<item id="aca2261f-e837-4a2d-a555-0c81b2c7f7a2">7</item>
<item id="b7ecb7bd-8c3e-475d-ba17-4c62c1c3d90b">8</item>
<item id="d28f95e8-452c-474f-9c9a-11e09cd948ae">9</item>
</output>
产生的后续运行:
结果 2
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="6eb63a8e-599d-450a-8970-a758b73aa121">1</item>
<item id="86b247bf-81c8-47ce-9375-4a35e44fcde7">2</item>
<item id="cbc04786-9e90-4331-a9d3-47955c7d5a99">3</item>
<item id="9f82f8d0-9934-499e-8783-61087ebce2f7">4</item>
<item id="5b77da5b-f28f-45a7-82f4-a47b6b1aa7b2">6</item>
<item id="7eab11bc-209f-4100-b4e6-1cc0f73beda0">7</item>
<item id="7f4151f4-6166-4406-9ee4-e7de325537d0">8</item>
<item id="2185c4b8-6a74-4b97-93b4-872b2c0e1f5e">9</item>
</output>
结果 3
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="784b9cd0-a77a-4719-ad0b-183a970b6785">1</item>
<item id="4dbed80b-4c82-4dde-8a0a-8b29471bdbbf">2</item>
<item id="0297ad52-3070-4b6a-a28b-a9c7c4607027">3</item>
<item id="8e402219-3fbf-4025-827b-c95ae4e12ea0">4</item>
<item id="140c8fad-2d93-4b77-b548-5a150f350d81">6</item>
<item id="5ca365ac-43dd-41fa-9fa7-6237971576aa">7</item>
<item id="6ac7bb94-88cd-442e-8c3b-933ca3d53fb5">8</item>
<item id="3cc77134-77ee-4405-bf33-92e6dc7bfdc1">9</item>
</output>
等等。
有一些基于 1.0 版 XSLT 的语言和方法的解决方案。
让样本XML如下。 (样本 XML 取自 https://www.cs.utexas.edu/~mitra/csFall2015/cs329/lectures/xml/xslplanes.2.xml.txt)
<?xml version = "1.0" encoding = "utf-8"?>
<planes xmlns="planes_from_cs_utexas_edu">
<plane>
<year> 1977 </year>
<make> Cessna </make>
<model> Skyhawk </model>
<color> Light blue and white </color>
</plane>
<plane>
<year> 1975 </year>
<make> Piper </make>
<model> Apache </model>
<color> White </color>
</plane>
<plane>
<year> 1960 </year>
<make> Cessna </make>
<model> Centurian </model>
<color> Yellow and white </color>
</plane>
<plane>
<year> 1956 </year>
<make> Piper </make>
<model> Tripacer </model>
<color> Blue </color>
</plane>
</planes>
因为有C++需求,所以有如下解决方法。
1.使用Xalan C++版本(似乎适合题目)
在 https://xalan.apache.org/old/xalan-c/extensions.html 中有针对此方法的 C++ 示例代码。它只显示平方根,但它可以转换为创建 GUID,例如在 Windows 中使用 CoCreateGuid() 方法或在 Linux 环境中使用 libuuid,并且它可以作为 XObjectPtr 返回,如将 GUID 转换为 XalanDOMString。
例如,如果使用其他语言,则解决方案如下。
Java/.NET(以下示例在 Java 中,但这些方法也可以应用于任何 .NET 语言)
1.使用自反扩展函数(基于Saxon)
注意:此解决方案仅适用于 Saxon-PE 和 Saxon-EE
XSLT 可以如下所示,包括直接调用 Java 的 UUID class' 方法。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uuid="java:java.util.UUID"
xmlns:ns1="planes_from_cs_utexas_edu"
exclude-result-prefixes="uuid">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/ns1:planes">
<planes>
<xsl:for-each select = "ns1:plane">
<plane>
<year>
<xsl:value-of select="ns1:year" />
</year>
<make>
<xsl:value-of select="ns1:make" />
</make>
<model>
<xsl:value-of select="ns1:model" />
</model>
<color>
<xsl:value-of select="ns1:color" />
</color>
<uuid>
<xsl:value-of select="uuid:randomUUID()"/>
</uuid>
</plane>
</xsl:for-each>
</planes>
</xsl:template>
</xsl:stylesheet>
输出将是:
<?xml version="1.0" encoding="utf-8"?>
<planes xmlns:ns1="planes_from_cs_utexas_edu">
<plane>
<year> 1977 </year>
<make> Cessna </make>
<model> Skyhawk </model>
<color> Light blue and white </color>
<uuid>50ef735f-a1a1-46cb-a638-05966b2c2b78</uuid>
</plane>
<plane>
<year> 1975 </year>
<make> Piper </make>
<model> Apache </model>
<color> White </color>
<uuid>8e9b5345-445c-4700-8191-08731c44e1e0</uuid>
</plane>
<plane>
<year> 1960 </year>
<make> Cessna </make>
<model> Centurian </model>
<color> Yellow and white </color>
<uuid>01b01db9-982a-4811-a5b3-efa73a39dacd</uuid>
</plane>
<plane>
<year> 1956 </year>
<make> Piper </make>
<model> Tripacer </model>
<color> Blue </color>
<uuid>3a2f7ee2-c53c-46b5-903f-39a21990aa75</uuid>
</plane>
</planes>
2.使用集成扩展函数(基于Saxon)
注意:此解决方案适用于所有 Saxon 版本
见http://saxonica.com/html/documentation/extensibility/integratedfunctions/
中也有一个示例用法
C#
1. XSLT 样式表脚本使用 msxsl:script(基于 Microsoft 处理器)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="planes_from_cs_utexas_edu"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
exclude-result-prefixes="uuid">
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public double uuid()
{
return Guid.NewGuid().ToString();
}
]]>
</msxsl:script>
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/ns1:planes">
<planes>
<xsl:for-each select = "ns1:plane">
<plane>
<xsl:copy-of select="node()"/>
<uuid>
<xsl:value-of select="user:uuid()"/>
</uuid>
</plane>
</xsl:for-each>
</planes>
</xsl:template>
</xsl:stylesheet>
输出将类似于上面的示例输出。
在我们的遗留项目中,我们使用基于 xslt 1.0
版本的 libxslt
。
现在需要使用 xslt 文件生成 UUID,以便我们的输出 xml 文件包含 UUID。
根据 我运气不好。
也按照这个https://gist.github.com/azinneera/778f69ae6b0049b5edcd69da70072405 我们可以生成 UUID,但是使用 xslt 2.0.
我是 xslt 的新手,有什么方法可以将 https://gist.github.com/azinneera/778f69ae6b0049b5edcd69da70072405 样式 sheet 从 2.0 版转换为 1.0 版,或者有其他方法可以使用 xslt 1.0 生成 UUID 吗?
正如我在对您的问题的评论中所述,如果您使用的是 libxslt
处理器,则可以使用 EXSLT math:random()
扩展函数生成一个随机数序列,这些随机数最终将形成版本 4 UUID。
这是一个实现示例:
XSLT 1.0 + EXSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:math="http://exslt.org/math"
xmlns:func="http://exslt.org/functions"
xmlns:my="www.example.com/my"
extension-element-prefixes="func math my">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<func:function name="my:UUID4">
<!-- https://www.ietf.org/rfc/rfc4122.txt -->
<func:result>
<!-- 8 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 4 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<!-- version identifier -->
<xsl:text>-4</xsl:text>
<!-- 3 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 1* -->
<xsl:value-of select="substring('89ab', floor(4*math:random()) + 1, 1)" />
<!-- 3 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:text>-</xsl:text>
<!-- 12 -->
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
<xsl:value-of select="substring('0123456789abcdef', floor(16*math:random()) + 1, 1)" />
</func:result>
</func:function>
<xsl:template match="/items">
<output>
<xsl:for-each select="item">
<item id="{my:UUID4()}">
<xsl:value-of select="." />
</item>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
应用于以下输入时:
XML
<items>
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>6</item>
<item>7</item>
<item>8</item>
<item>9</item>
</items>
我得到以下结果:
结果 1
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="77587d4c-1ef6-4aaf-9f97-398dee70fa25">1</item>
<item id="148e4218-c881-41d3-af61-cab4b5d0251f">2</item>
<item id="3a02b568-3200-46ff-993c-3bea9724d6ce">3</item>
<item id="28de29bd-39f4-4eed-979a-765c290652a1">4</item>
<item id="7c767fa7-c0b7-4187-9f86-d3876ec1be8a">6</item>
<item id="aca2261f-e837-4a2d-a555-0c81b2c7f7a2">7</item>
<item id="b7ecb7bd-8c3e-475d-ba17-4c62c1c3d90b">8</item>
<item id="d28f95e8-452c-474f-9c9a-11e09cd948ae">9</item>
</output>
产生的后续运行:
结果 2
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="6eb63a8e-599d-450a-8970-a758b73aa121">1</item>
<item id="86b247bf-81c8-47ce-9375-4a35e44fcde7">2</item>
<item id="cbc04786-9e90-4331-a9d3-47955c7d5a99">3</item>
<item id="9f82f8d0-9934-499e-8783-61087ebce2f7">4</item>
<item id="5b77da5b-f28f-45a7-82f4-a47b6b1aa7b2">6</item>
<item id="7eab11bc-209f-4100-b4e6-1cc0f73beda0">7</item>
<item id="7f4151f4-6166-4406-9ee4-e7de325537d0">8</item>
<item id="2185c4b8-6a74-4b97-93b4-872b2c0e1f5e">9</item>
</output>
结果 3
<?xml version="1.0" encoding="UTF-8"?>
<output>
<item id="784b9cd0-a77a-4719-ad0b-183a970b6785">1</item>
<item id="4dbed80b-4c82-4dde-8a0a-8b29471bdbbf">2</item>
<item id="0297ad52-3070-4b6a-a28b-a9c7c4607027">3</item>
<item id="8e402219-3fbf-4025-827b-c95ae4e12ea0">4</item>
<item id="140c8fad-2d93-4b77-b548-5a150f350d81">6</item>
<item id="5ca365ac-43dd-41fa-9fa7-6237971576aa">7</item>
<item id="6ac7bb94-88cd-442e-8c3b-933ca3d53fb5">8</item>
<item id="3cc77134-77ee-4405-bf33-92e6dc7bfdc1">9</item>
</output>
等等。
有一些基于 1.0 版 XSLT 的语言和方法的解决方案。
让样本XML如下。 (样本 XML 取自 https://www.cs.utexas.edu/~mitra/csFall2015/cs329/lectures/xml/xslplanes.2.xml.txt)
<?xml version = "1.0" encoding = "utf-8"?>
<planes xmlns="planes_from_cs_utexas_edu">
<plane>
<year> 1977 </year>
<make> Cessna </make>
<model> Skyhawk </model>
<color> Light blue and white </color>
</plane>
<plane>
<year> 1975 </year>
<make> Piper </make>
<model> Apache </model>
<color> White </color>
</plane>
<plane>
<year> 1960 </year>
<make> Cessna </make>
<model> Centurian </model>
<color> Yellow and white </color>
</plane>
<plane>
<year> 1956 </year>
<make> Piper </make>
<model> Tripacer </model>
<color> Blue </color>
</plane>
</planes>
因为有C++需求,所以有如下解决方法。
1.使用Xalan C++版本(似乎适合题目)
在 https://xalan.apache.org/old/xalan-c/extensions.html 中有针对此方法的 C++ 示例代码。它只显示平方根,但它可以转换为创建 GUID,例如在 Windows 中使用 CoCreateGuid() 方法或在 Linux 环境中使用 libuuid,并且它可以作为 XObjectPtr 返回,如将 GUID 转换为 XalanDOMString。
例如,如果使用其他语言,则解决方案如下。
Java/.NET(以下示例在 Java 中,但这些方法也可以应用于任何 .NET 语言)
1.使用自反扩展函数(基于Saxon)
注意:此解决方案仅适用于 Saxon-PE 和 Saxon-EE
XSLT 可以如下所示,包括直接调用 Java 的 UUID class' 方法。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uuid="java:java.util.UUID"
xmlns:ns1="planes_from_cs_utexas_edu"
exclude-result-prefixes="uuid">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/ns1:planes">
<planes>
<xsl:for-each select = "ns1:plane">
<plane>
<year>
<xsl:value-of select="ns1:year" />
</year>
<make>
<xsl:value-of select="ns1:make" />
</make>
<model>
<xsl:value-of select="ns1:model" />
</model>
<color>
<xsl:value-of select="ns1:color" />
</color>
<uuid>
<xsl:value-of select="uuid:randomUUID()"/>
</uuid>
</plane>
</xsl:for-each>
</planes>
</xsl:template>
</xsl:stylesheet>
输出将是:
<?xml version="1.0" encoding="utf-8"?>
<planes xmlns:ns1="planes_from_cs_utexas_edu">
<plane>
<year> 1977 </year>
<make> Cessna </make>
<model> Skyhawk </model>
<color> Light blue and white </color>
<uuid>50ef735f-a1a1-46cb-a638-05966b2c2b78</uuid>
</plane>
<plane>
<year> 1975 </year>
<make> Piper </make>
<model> Apache </model>
<color> White </color>
<uuid>8e9b5345-445c-4700-8191-08731c44e1e0</uuid>
</plane>
<plane>
<year> 1960 </year>
<make> Cessna </make>
<model> Centurian </model>
<color> Yellow and white </color>
<uuid>01b01db9-982a-4811-a5b3-efa73a39dacd</uuid>
</plane>
<plane>
<year> 1956 </year>
<make> Piper </make>
<model> Tripacer </model>
<color> Blue </color>
<uuid>3a2f7ee2-c53c-46b5-903f-39a21990aa75</uuid>
</plane>
</planes>
2.使用集成扩展函数(基于Saxon)
注意:此解决方案适用于所有 Saxon 版本
见http://saxonica.com/html/documentation/extensibility/integratedfunctions/
C#
1. XSLT 样式表脚本使用 msxsl:script(基于 Microsoft 处理器)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns1="planes_from_cs_utexas_edu"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:user="urn:my-scripts"
exclude-result-prefixes="uuid">
<msxsl:script language="C#" implements-prefix="user">
<![CDATA[
public double uuid()
{
return Guid.NewGuid().ToString();
}
]]>
</msxsl:script>
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:template match="/ns1:planes">
<planes>
<xsl:for-each select = "ns1:plane">
<plane>
<xsl:copy-of select="node()"/>
<uuid>
<xsl:value-of select="user:uuid()"/>
</uuid>
</plane>
</xsl:for-each>
</planes>
</xsl:template>
</xsl:stylesheet>
输出将类似于上面的示例输出。