我遇到以下任务的问题。
我的XML示例是:
<?xml version="1.0" encoding="ISO-8859-1"?>
<doors>
<module>
<object>
<object_type>heading</object_type>
<object_level>1</object_level>
<Object__Heading>Functions</Object__Heading>
</object>
<object>
<object_type>heading</object_type>
<object_level>2</object_level>
<Object__Heading>not_interesting</Object__Heading>
</object>
<object>
<object_type>text</object_type>
<object_level></object_level>
<Object__Heading>not_interesting</Object__Heading>
<Object___Text>SignalName1</Object___Text>
<RB_Signal_Type>boolean</RB_Signal_Type>
<RB_Signal_Min></RB_Signal_Min>
</object>
<object>
<object_type>text</object_type>
<object_level></object_level>
<Object__Heading>not_interesting</Object__Heading>
<Object___Text>SignalName2</Object___Text>
<RB_Signal_Type>u_int8</RB_Signal_Type>
<RB_Signal_Min></RB_Signal_Min>
</object>
<object>
<object_type>heading</object_type>
<object_level>1</object_level>
<Object__Heading>CAN</Object__Heading>
</object>
<object>
<object_type>text</object_type>
<object_level></object_level>
<Object__Heading>not_interesting</Object__Heading>
<Object___Text>SignalName3</Object___Text>
<RB_Signal_Type>boolean</RB_Signal_Type>
<RB_Signal_Min></RB_Signal_Min>
</object>
</module>
</doors>
我想解析<Object__Text>
中的SignalName,然后获取有关<Signal_Type>
和&lt; Signal Min>
的兄弟信息。
我能够通过以下XSL部分来实现这一点:
<TT><xsl:value-of select="concat('Signal_Type: ',document('SSTbytool.xml')/doors/module/object[Object___Text = $SignalName]/RB_Signal_Type)"/></TT>
<TT><xsl:value-of select="concat('Signal_Min: ',document('SSTbytool.xml')/doors/module/object[Object___Text = $SignalName]/RB_Signal_Min)"/></TT>
此部分位于Transformation XSLT文件中。
所需的附加信息在外部xml中(我们称之为Group.xml),这就是我使用document()函数的原因。
现在的问题是,我还需要知道<Object__Heading>
这个信号元素是。例如。 SignalName1位于CAN下的Object__Heading Functions和SignalName3下。
我已经尝试过此代码,但它无效:
<xsl:when test="preceding-sibling::document('SSTbytool.xml')/doors/module/object[Object___Text = $SignalName][object_type = 'heading' and object_level = '1' and Object___Heading = 'Functions']">
为了更好地理解:我必须使用不同的xml文件,我们假设它是Group.xml和这个example.xml。然后我使用XSLT转换Output.xml中的Group.xml。但是example.xml包含我想要添加的其他信息。因此,我接受SignalName变量(包含Group.xml中的String),并希望从example.xml中为此变量添加其他信息。
所以我的预期输出应该是......像:
<TT>Signal_Name: SignalName1</TT>
<TT>Signal_Type: boolean</TT>
<TT>Signal_Min:</TT>
<TT>Object__Heading : Functions</TT>
<TT>Signal_Name: SignalName2</TT>
<TT>Signal_Type: u_int8</TT>
<TT>Signal_Min:</TT>
<TT>Object__Heading : Functions</TT>
<TT>Signal_Name: SignalName3</TT>
<TT>Signal_Type: boolean</TT>
<TT>Signal_Min:</TT>
<TT>Object__Heading : CAN</TT>
我不知道如何获得正确的Object_Heading参数。
有人可以帮我吗?或者甚至更简单的方法来做到这一点?
我希望你理解我的问题!
答案 0 :(得分:0)
它仍然非常令人困惑。我们假设以下输入:
<强> XML 强>
<root>
<string>SignalName1</string>
<string>SignalName2</string>
<string>SignalName3</string>
</root>
以及另一个名为SSTbytool.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:param name="lookupdoc" select="document('SSTbytool.xml')" />
<xsl:template match="/root">
<xsl:copy>
<xsl:apply-templates select="string"/>
</xsl:copy>
</xsl:template>
<xsl:template match="string">
<xsl:variable name="object" select="$lookupdoc/doors/module/object[Object___Text = current()]" />
<signal>
<name>
<xsl:value-of select="."/>
</name>
<type>
<xsl:value-of select="$object/RB_Signal_Type"/>
</type>
<min>
<xsl:value-of select="$object/RB_Signal_Min"/>
</min>
<heading>
<xsl:value-of select="$object/preceding-sibling::object[object_type='heading' and object_level='1'][1]/Object__Heading"/>
</heading>
</signal>
</xsl:template>
</xsl:stylesheet>
将生成结果:
<?xml version="1.0" encoding="utf-8"?>
<root>
<signal>
<name>SignalName1</name>
<type>boolean</type>
<min/>
<heading>Functions</heading>
</signal>
<signal>
<name>SignalName2</name>
<type>u_int8</type>
<min/>
<heading>Functions</heading>
</signal>
<signal>
<name>SignalName3</name>
<type>boolean</type>
<min/>
<heading>CAN</heading>
</signal>
</root>