我有以下输入(为了简洁而剥离了无关的元素):
input.xml中
<Request>
<Party>
<PartyInfo>
<PartyCode>WT</PartyCode>
<ClientDate>01-01-2017</ClientDate>
</PartyInfo>
<General>
<Phone>
<PhoneNumber>555-1234</PhoneNumber>
<PhoneCode>Cell</PhoneCode>
</Phone>
<Phone>
<PhoneNumber>123-1234</PhoneNumber>
<PhoneCode>Cell</PhoneCode>
</Phone>
<!--rest of children -->
</General>
</Party>
</Request>
我想匹配其子PartyCode等于WT的任何Party元素。然后,对于每个WT编码的Party块,我想匹配子元素Phone,如果它的PhoneCode = Cell,最后复制内容以及向其添加2个自定义元素。以下是现在的内容(目前匹配代码WT的每个Party元素和代码Cell的电话索引):
stylesheet.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0">
<!-- identity transform, other templates -->
<xsl:template match="Party[PartyInfo/PartyCode='WT'][1]/General/Phone[PhoneCode='Cell'][1]">
<xsl:copy>
<xsl:element name="PhoneCode">Phone</xsl:element>
<xsl:element name="UsePhone">Yes</xsl:element>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="Party[PartyInfo/PartyCode='WT'][1]/General/Phone[PhoneCode='Cell'][2]">
<xsl:copy>
<xsl:element name="PhoneCode">Phone</xsl:element>
<xsl:element name="UsePhone">Yes</xsl:element>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="Party[PartyInfo/PartyCode='WT'][2]/General/Phone[PhoneCode='Cell'][1]">
<xsl:copy>
<xsl:element name="PhoneCode">Phone</xsl:element>
<xsl:element name="UsePhone">Yes</xsl:element>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="Party[PartyInfo/PartyCode='WT'][2]/General/Phone[PhoneCode='Cell'][2]">
<xsl:copy>
<xsl:element name="PhoneCode">Phone</xsl:element>
<xsl:element name="UsePhone">Yes</xsl:element>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<!-- 1 more 'group' of templates as above for WIT[3] -->
</xsl:stylesheet>
我已经在一些地方读过,在xsl中应该避免for-each循环,因为它是一个更加强制性的概念,用于更多的过程语言,并且循环应该用apply-templates等替换,但我正在努力将如上所述的比赛分组。遵循XSLT的最佳实践,我可以使用哪种XSLT v2解决方案将这些模板合并为1?注意:我使用的是Saxon HE 9.7.0-8