我们使用的产品之一能够将配置信息输出为XML,但在该输出文件中,它们不包括实际的主机标识符(名称),而是对每个标识符使用一种GUID引用。
我制作了一个XML文件,其中包含主机标识符GUID和实际主机标识符(查找)之间的"映射",我想实现一个XSLT,该XSLT将遍历配置文件,并用主机标识符名称替换所有主机标识符GUID,它将从我制作的另一XML文件(查找.XML)中查找该名称。
以下是lookup.xml文件的样子:
<?xml version="1.0"?>
<hostids>
<hostid name="e687903c-d185-4560-9117-c60f386b76c1">Agent</hostid>
<hostid name="b9230962-13ca-4d23-abf8-d3cd1ca4dffc">test2</hostid>
</hostids>
下面是配置文件的样子(我通过一些处理运行了原始文件):
<?xml version="1.0"?>
<resources>
<resource><host>e687903c-d185-4560-9117-c60f386b76c1</host><url>/console/**</url></resource>
<resource><host>b9230962-13ca-4d23-abf8-d3cd1ca4dffc</host><url>/ServiceByName</url></resource>
</resources>
输出应该是这样的:
<?xml version="1.0"?>
<resources>
<resource><host>Agent</host><url>/console/**</url></resource>
<resource><host>test2</host><url>/ServiceByName</url></resource>
</resources>
我在RedHat机器上使用xsltproc,我想这就是XSLT1.0。
我已经尝试使用我在这里找到的几个不同的示例XSLT来实现这一点,例如:
XSLT";替换";值与属性匹配的另一个文件
但他们中的任何一个都没能工作。
有人能提供一个XSLT1.0示例来实现这一点吗?
第页。S.这是另一个有示例的线程,XSLT1.0示例对我来说不起作用。当我运行它时(在修改以匹配我的元素名称等之后),它看起来就像是把整个原始XML都包了进去。
如何使用另一个XML文件中的属性值作为当前XML 中的元素值选择
这样试试?
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="path-to-lookup" select="'lookup.xml'" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="host">
<xsl:copy>
<xsl:value-of select="document($path-to-lookup)/hostids/hostid[@name = current()]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,如果你喜欢:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="path-to-lookup" select="'lookup.xml'" />
<xsl:key name="host" match="hostid" use="@name" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="host">
<xsl:copy>
<xsl:variable name="host-id" select="." />
<!-- switch context to lookup document in order to use key -->
<xsl:for-each select="document($path-to-lookup)">
<xsl:value-of select="key('host', $host-id)" />
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>