xsl:遍历没有xsl:for-each的元素

时间:2017-02-27 11:58:01

标签: xml xslt

我有以下输入(为了简洁而剥离了无关的元素):

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

0 个答案:

没有答案