0

这就是问题所在:转换后的 XSLT 应该显示两个电话号码,<Phone_1> 和 <Phone_2>,每个号码一个。只是添加了传真标签以供参考。

这是我必须转换的 XML 片段:

    <DirPartyContactInfoView>
        <Locator>08-922100</Locator>
        <Type>Phone</Type>
    </DirPartyContactInfoView>
        <Locator>073-6564865</Locator>
        <Type>Phone</Type>
    </DirPartyContactInfoView>    
        <Locator>08-922150</Locator>
        <Type>Fax</Type>
    </DirPartyContactInfoView>

这是我目前对这个片段的 XSLT 的看法。到目前为止,我已经尝试将变量设置为条件,知道它只能设置一次变量值而不能修改它。

<xsl:for-each select="DirPartyContactInfoView">
    <xsl:choose>
        <xsl:when test="Type='Phone'">
            <xsl:variable name="Phone1" />
            <xsl:choose>                                        
                <xsl:when test="Phone1=''">     
                    <xsl:variable name="Phone1" select="Locator" />                                 
                    <Phone_1>
                        <xsl:value-of select="Locator" />
                    </Phone_1>
                </xsl:when>
                <xsl:otherwise>
                    <Phone_2>
                        <xsl:value-of select="Locator" />
                    </Phone_2>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
        <xsl:when test="Type='Fax'">
            <Fax>
                <xsl:value-of select="Locator" />
            </Fax>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

然而,我在输出中得到了两个 <Phone_2>,我完全没有想法。我猜我不能使用这样的变量。有任何解决这个问题的方法吗?

4

3 回答 3

1

对于您拥有的(看似)简单的要求,这非常复杂。如果我没听错,试试这个:

<xsl:template match="/">
    <xsl:apply-templates select='root/DirPartyContactInfoView[Type="Phone"]' />
</xsl:template>
<xsl:template match='DirPartyContactInfoView'>
    <xsl:element name='phone_{position()}'>
        <xsl:value-of select='Locator' />
    </xsl:element>
</xsl:template>

我假设了一个根节点root,因为您的 XML 没有向我们显示您拥有的根节点。

演示(见输出)。

XSLT 中的一个好的经验法则是,如果您发现自己严重依赖for-each构造或变量,那么可能有更好的方法。

于 2013-09-19T09:28:16.653 回答
1

你真的需要一个xsl:for-each循环吗?您也可以使用 XPath 直接访问该<Locator>元素:

 //DirPartyContactInfoView[1]/Locator
 //DirPartyContactInfoView[2]/Locator

如果您仍然需要xsl:for-each循环,也许这样的事情会有所帮助:

<xsl:for-each select="DirPartyContactInfoView">
    <xsl:choose>
        <xsl:when test="Type='Phone'">
            <xsl:choose>                                        
                <xsl:when test="position()='1'">     
                    <Phone_1>
                        <xsl:value-of select="Locator" />
                    </Phone_1>
                </xsl:when>
                <xsl:otherwise>
                    <Phone_2>
                        <xsl:value-of select="Locator" />
                    </Phone_2>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:when>
    </xsl:choose>
</xsl:for-each>
于 2013-09-19T09:32:47.477 回答
0

@flaskis 通过更改问题来回应先前的答案,所以我有点不愿意参与进来,但这里的适当解决方案可能是以下形式

<xsl:template match="phone[1]">...</xsl:template>
<xsl:template match="phone[2]">...</xsl:template>

其中不同的模板规则应用于第一个和第二个电话元素。

于 2013-09-19T11:36:52.293 回答