我有2个XML文件,我需要根据匹配转换为1。主文件(Assets.xml)看起来像这样转换多个XML文件
<Records>
<Record>
<Field id="15072">Server A</Field>
<Field id="15073">
<ListValues>
<ListValue id="65502">Information</ListValue>
</ListValues>
</Field>
<Field id="15083">
<Reference id="205773">Control Instance A</Reference>
</Field>
</Record>
<Record>
<Field id="15072">Server B</Field>
<Field id="15073">
<ListValues>
<ListValue id="65502">Physical</ListValue>
</ListValues>
</Field>
<Field id="15083">
<Reference id="205773">Control Instance A</Reference>
</Field>
</Record>
</Records>
第二个文件(ControlDefinitions.xml)看起来像这样
<Records>
<Record>
<Field id="15056">AR005</Field>
<Field id="15086">
<ListValues>
<ListValue id="65504">Information</ListValue>
</ListValues>
</Field>
</Record>
<Record>
<Field id="15056">AR001</Field>
<Field id="15086">
<ListValues>
<ListValue id="65504">Information</ListValue>
</ListValues>
</Field>
</Record>
<Record>
<Field id="15056">AR002</Field>
<Field id="15086">
<ListValues>
<ListValue id="65504">Physical</ListValue>
</ListValues>
</Field>
</Record>
</Records>
对于输出,我需要为每个资产单个记录/控制定义组合具有相同的类型(即信息,物理等)。输出应该看起来像这样。
<InstanceRecords>
<InstanceRecord>
<Asset>Server A</Asset>
<ControlInstance>Control Instance A</ControlInstance>
<ControlDefinition>AR005</ControlDefinition>
</InstanceRecord>
<InstanceRecord>
<Asset>Server A</Asset>
<ControlInstance>Control Instance A</ControlInstance>
<ControlDefinition>AR002</ControlDefinition>
</InstanceRecord>
</InstanceRecords>
我一直在使用的样式表如下。有没有办法做到这一点?任何帮助将不胜感激!谢谢!
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="control_definitions" select="document('../XML/ControlDefinitions.xml')"/>
<xsl:template name="getAsset">
<xsl:value-of select="Field[@id='15072']"/>
</xsl:template>
<xsl:template name="getISMSInstance">
<xsl:value-of select="Field[@id='15083']/Reference"/>
</xsl:template>
<xsl:template name="getControlDef">
<xsl:for-each select="$control_definitions/Records/Record">
<xsl:if test="Field[@id='15086']/ListValues/ListValue='Information'">
<ControlDefinition>
<xsl:value-of select="$control_definitions/Records/Record/Field[@id='15056']"/>
</ControlDefinition>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="Records">
<InstanceRecords>
<xsl:for-each select="Record">
<xsl:if test="Field[@id='15073']/ListValues/ListValue='Information'">
<InstanceRecord>
<Asset>
<xsl:call-template name="getAsset"/>
</Asset>
<ControlInstance>
<xsl:call-template name="getInstance"/>
</ControlInstance>
<xsl:call-template name="getControlDef"/>
</InstanceRecord>
</xsl:if>
</xsl:for-each>
</InstanceRecords>
</xsl:template>
</xsl:stylesheet>
谢谢!这对于匹配ListValues非常适用,但并不完全符合所需的输出。以下是我想要生成的输出。那可能吗?谢谢!
<InstanceRecords>
<InstanceRecord>
<Asset>Server A</Asset>
<ControlInstance>Control Instance A</ControlInstance>
<ControlDefinition>AR005</ControlDefinition>
</InstanceRecord>
<InstanceRecord>
<Asset>Server A</Asset>
<ControlInstance>Control Instance A</ControlInstance>
<ControlDefinition>AR001</ControlDefinition>
</InstanceRecord>
<InstanceRecord>
<Asset>Server B</Asset>
<ControlInstance>Control Instance A</ControlInstance>
<ControlDefinition>AR002</ControlDefinition>
</InstanceRecord>
</InstanceRecords>
您ControlDefinitions.xml似乎是无效的,因为他们有多个ID,这些ID是相同的。 –