XSLT解析String和前一个兄弟的元素

时间:2015-04-15 08:06:44

标签: xml xslt

我遇到以下任务的问题。

我的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参数。

有人可以帮我吗?或者甚至更简单的方法来做到这一点?

我希望你理解我的问题!

1 个答案:

答案 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>
相关问题