我有以下示例 XML:
<?xml version="1.0"encoding="UTF-8"?>
<Root>
<Record>
<JobProfile>
<Status>
<Code>Pending</Code>
</Status>
<ID>
<Code>007</Code>
</ID>
</JobProfile>
<JobProfile>
<Status>
<Code>Active</Code>
</Status>
<ID>
<Code>003</Code>
</ID>
</JobProfile>
<JobProfile>
<Status>
<Code>Terminated</Code>
</Status>
<ID>
<Code>004</Code>
</ID>
</JobProfile>
</Record>
</Root>
我需要得到如下输出:
<Root>
<Record>
<ID>003</ID>
</Record>
</Root>
逻辑是 - 读取输入 XML,找到 JobProfile/Status/Code =“Active”的节点。找到后,读取兄弟级别的 JobProfile/ID/Code 并将其写入输出中。
尝试了下面的 XSLT 但它不起作用
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Root/Record">
<ID>
<xsl:for-each select="Record/JobProfile">
<xsl:if test="Status/Code='Active'">
<xsl:value-of select="ID/Code"/>
</xsl:if>
</xsl:for-each>
</ID>
</xsl:template>
</xsl:stylesheet>
使用
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/Root/Record/JobProfile[Status/Code != 'Active']"/>
<xsl:template match="/Root/Record/JobProfile[Status/Code = 'Active']">
<ID>
<xsl:value-of select="ID/Code"/>
</ID>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<!-- Identity template : copy all text nodes, elements and attributes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- filter JobProfile which is not Active and all Status elements-->
<xsl:template match="JobProfile[not(Status/Code = 'Active')]|Status"/>
<!-- skip JobProfile|Code but apply templates to use ID-->
<xsl:template match="JobProfile|Code">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
</xsl:stylesheet>