XSLT用于在一个XML中查找值并替换为另一个XML文件

时间:2016-07-28 16:46:05

标签: xml xslt xslt-1.0

我们使用的产品之一是能够以XML格式输出配置信息,但是,在该输出文件中,它们不是包含实际的主机标识符(名称),而是为每个标识符使用一种GUID引用。 / p>

我制作了一个包含"映射"的XML文件。主机标识符GUID和实际主机标识符(查找)之间,我想实现一个XSLT,它将通过配置文件并用主机标识符名称替换所有主机标识符GUID,它将从其他XML查找我创建的文件(lookup.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,我认为这是XSLT 1.0。

我试图让我使用我在这里找到的几个不同的示例XSLT,例如:

XSLT "replace" values with another file matching by attribute

但是还没有能够让他们中的任何一个工作。

任何人都可以提供可能能够实现此目的的XSLT 1.0示例吗?

P.S。这是另一个有示例的线程,XSLT 1.0示例对我来说不起作用。当我运行它(在修改以匹配我的元素名称等)之后,看起来它只是将整个原始XML包装在其中。

How to use attribute values from another XML file as an element value selection in the current XML

1 个答案:

答案 0 :(得分:1)

以这种方式试试吗?

XSLT 1.0

counterContainer

或者,如果您愿意:

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>