0

我有以下 xml 文本,

<SUBSCRIBER>
    <Anumber>639081000000</Anumber>
    <FirstCallDate>20130430104419</FirstCallDate>
    <SetyCode>TNT</SetyCode>
    <Status>ACT</Status>
    <RoamIndicator/>
    <PreloadCode>P1</PreloadCode>
    <CreationDate>20130116100037</CreationDate>
    <PreActiveEndDate/>
    <ActiveEndDate>20130804210541</ActiveEndDate>
    <GraceEndDate>20140502210541</GraceEndDate>
    <RetailerIndicator/>
    <OnPeakAccountID>9100</OnPeakAccountID>
    <OnPeakSmsExpDate>20130804210504</OnPeakSmsExpDate>
    <UnivWalletAcc/>
    <UnliSmsOnCtl>20130606211359</UnliSmsOnCtl>
    <UnliSmsTriCtl/>
    <UnliSmsGblCtl/>
    <UnliMocOnCtl>20130606211359</UnliMocOnCtl>
    <UnliMocTriCtl/>
    <UnliMocGblCtl/>
    <UnliSurfFbcCtl>20130606212353</UnliSurfFbcCtl>
</SUBSCRIBER>

如何迭代/解析每个 xml 标签名称并获取值(我需要标签名称和不同变量中的值)?而且,我怎样才能从特定的标签名称开始迭代?例如:我想开始迭代 UnivWalletAcc

请指教。

到目前为止,我已经尝试了以下方法,

<xsl:template match="SUBSCRIBER">
    <xsl:variable name="tagName">
        <xsl:value-of select="/*/*/name()"/>
    </xsl:variable>
    <xsl:variable name="tagValue">
        <xsl:value-of select="/*/*/text()"/>
    </xsl:variable>
    <xsl:value-of select="$tagName"/>
    <xsl:value-of select="$tagValue"/>
</xsl:template>
4

2 回答 2

3

作为 Veenstra 解决方案的替代方案,您可以在应用模板中控制迭代,而不是 xsl:if 在 SUBSCRIBER/* 模板中:

<xsl:template match="SUBSCRIBER">
    <data>
        <xsl:apply-templates select="UnivWalletAcc, 
                                     UnivWalletAcc/following-sibling::*" />
    </data>
</xsl:template>
于 2013-10-28T17:06:25.007 回答
1

使用以下 XSLT,您可以遍历节点 SUBSCRIBER 的所有子节点:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <!-- Identity template that will loop over all nodes and attributes -->
    <xsl:template match="@*|node()">
        <xsl:apply-templates select="@*|node()" />
    </xsl:template>

    <!-- Template to match the root and create new root -->
    <xsl:template match="SUBSCRIBER">
        <data>
            <xsl:apply-templates select="@*|node()" />
        </data>
    </xsl:template>

    <!-- Template to loop over all childs of SUBSCRIBER node -->
    <xsl:template match="SUBSCRIBER/*">
        <!-- This will test if we have seen the UnivWalletAcc node already, if so, output something, otherwise, output nothing -->
        <xsl:if test="preceding-sibling::UnivWalletAcc or self::UnivWalletAcc">
            <tag>
                <tagName><xsl:value-of select="name()" /></tagName>
                <tagValue><xsl:value-of select="." /></tagValue>
            </tag>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>
于 2013-10-28T15:23:04.477 回答