HTML到XML转换XSLT

时间:2018-04-18 16:34:56

标签: html xml xslt

是否可以帮助我使用XSLT映射将以下HTML转换为XML。

输入HTML:

Bar

Input HTML

预期的XML:

<html><head></head><body>Array
(
    [Value] =&gt; 123
    [Head] =&gt; 456
    [Description] =&gt; Array
        (
            [1] =&gt; ABC
            [2] =&gt; DEF
            [3] =&gt; GHI
        )
    [Price] =&gt; Array
        (
            [1] =&gt; 123
            [2] =&gt; 456
            [3] =&gt; 789
        )
    [Quantity] =&gt; Array
        (
            [1] =&gt; 
            [2] =&gt; 
            [3] =&gt; 
        )
)</body></html>

Output XML

价值和头只出现一次。 而值,描述和数量的数组可能是多个。我需要在标签内对所有1s,2s等进行分组。 请帮忙。

1 个答案:

答案 0 :(得分:2)

您可以在 XSLT 2.0

中使用以下代码
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">
    <xsl:output indent="yes"/>

    <xsl:template match="/">
            <xsl:apply-templates select="//body"/>
    </xsl:template>

    <xsl:template match="body">
        <xsl:variable name="temp">
            <xsl:analyze-string select="text()" regex="\[(.+)\] =&gt; (.*)">
                <xsl:matching-substring>
                    <xsl:choose>
                        <xsl:when test="matches(regex-group(1), '^[0-9]+$')">
                            <Array name="{regex-group(1)}"><xsl:value-of select="regex-group(2)"/></Array>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:element name="{regex-group(1)}"><xsl:value-of select="regex-group(2)"/></xsl:element>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:matching-substring>
            </xsl:analyze-string>
        </xsl:variable>
        <aa>
            <xsl:copy-of select="$temp//Value"/>            
            <xsl:copy-of select="$temp//Head"/>
            <xsl:for-each-group select="$temp//Array" group-by="@name">
                <Lines>
                    <Description><xsl:value-of select="current-group()[1]"/></Description>
                    <Price><xsl:value-of select="current-group()[2]"/></Price>
                    <Quantity><xsl:value-of select="current-group()[3]"/></Quantity>
                </Lines>
            </xsl:for-each-group>            
        </aa>
    </xsl:template>
</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<aa>
   <Value>123</Value>
   <Head>456</Head>
   <Lines>
      <Description>ABC</Description>
      <Price>123</Price>
      <Quantity/>
   </Lines>
   <Lines>
      <Description>DEF</Description>
      <Price>456</Price>
      <Quantity/>
   </Lines>
   <Lines>
      <Description>GHI</Description>
      <Price>789</Price>
      <Quantity/>
   </Lines>
</aa>