XSLT在一个XML中查找值,并在另一个XML文件中替换



我们使用的产品之一能够将配置信息输出为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>

相关内容

  • 没有找到相关文章

最新更新