我需要使用 XSLT 来映射这种格式的值:
<Package>
<WorkflowProcesses>
<WorkflowProcess>
<Activities>
<Activity Name="First Activity" Id="123">
</Activity>
<Activity Name="Second Activity" Id="456">
</Activity>
<Activity Name="Third Activity" Id="789">
</Activity>
</Activities>
<Transitions>
<Transition To="789" From="456" Id="ABC">
</Transition>
<Transition To="456" From="123" Id="XYZ">
</Transition>
</Transitions>
</WorkflowProcess>
</WorkflowProcesses>
</Package>
到这种格式:
<variable type="State">
<stateId type="Integer">123</stateId>
<stateName type="String">First Activity</stateName>
<previousStatesId type="String[]">
</previousStatesId>
<nextStatesId type="String[]">
<item>456</item>
</nextStatesId>
</variable>
<variable type="State">
<stateId type="Integer">456</stateId>
<stateName type="String">Second Activity</stateName>
<previousStatesId type="String[]">
<item>123</item>
</previousStatesId>
<nextStatesId type="String[]">
<item>789</item>
</nextStatesId>
</variable>
<variable type="State">
<stateId type="Integer">789</stateId>
<stateName type="String">Third Activity</stateName>
<previousStatesId type="String[]">
<item>456</item>
</previousStatesId>
<nextStatesId type="String[]">
</nextStatesId>
</variable>
我正在努力的部分是从“转换”部分中获取值并将它们分配到正确的区域(“nextStatesId”和“previousStatesId”);其他一切都按预期工作。
到目前为止,我已经成功地使用以下方法映射了 Activity 项:
<xsl:template match="Activities">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Activity [@Name]">
<variable type="State">
<stateId type="Integer"><xsl:value-of select="@Id"/></stateId>
<stateName type="String"><xsl:value-of select="@Name"/></stateName>
</variable>
</xsl:template>
</xsl:stylesheet>
我可以使用它来识别所有的 Transition 项目,然后我打算将 Transition 的 id 与当前的 Activity 进行比较,但它在上面的模板中不起作用。我认为这是因为模板没有整个 XML 文件的可见性,因此不理解映射
<xsl:for-each select="Package/WorkflowProcesses/WorkflowProcess/Transitions/Transition">
<p>...do some stuff...</p>
</xsl:for-each>
通常,如果我在编码,我只需将它们推入两个列表,然后搜索它们。我打算在这里做的只是循环遍历每个活动中的所有转换,并为上一个/下一个状态 id 提供一个简单的“if”语句......但这似乎失败了。
有谁知道实现这一目标的另一种方法?