0

我正在尝试转换此 XML 文档:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<data>
    <entry>
        <databit>30.11.2012</databit>
        <databit>Foo</databit>
        <databit>Key: Value<br />Key: Value<br /> ... Key: Value</databit>
        <databit>some Foo content</databit>
        <databit>more Foo content</databit>
    </entry>
    <entry>
        ...
    </entry>
    ...
</data>

键值对的数量是可变的。分隔符始终是一个<br />标签。

输出应如下所示:

<data>
    <entry>
        <date>30.11.2012</date>
        <title>Foo</title>
        <info>
            <part key="Key" value="Value" />
            <part key="Key" value="Value" />
            <part key="Key" value="Value" />
        </info>
        <databit>some Foo content</databit>
        <databit>more Foo content</databit>
    </entry>
    <entry>
        ...
    </entry>
    ...
</data>

这是我编写的 XSLT 文档:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <data>
            <xsl:for-each select="/data/entry">
                <entry>
                    <date>
                        <xsl:value-of select="databit[1]"/>
                    </date>
                    <title>
                        <xsl:value-of select="databit[2]"/>
                    </title>
                    <info>
                        <xsl:value-of select="databit[3]"/>
                    </info>
                    <category>
                        <xsl:value-of select="databit[4]"/>
                    </category>
                    <status>
                        <xsl:value-of select="databit[5]"/>
                    </status>
                </entry>
            </xsl:for-each>
        </data>
    </xsl:template>
</xsl:stylesheet>

但我不知道如何转换info.

4

1 回答 1

2

此样式表应创建所需的转换。样式表假定 key 和 value 总是用 分隔,:它去掉了冒号和空格字符,但没有其他字符。normalize-space()如果需要删除空格,请使用。

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

    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="databit[1]">
        <date>
            <xsl:apply-templates/>
        </date>
    </xsl:template>

    <xsl:template match="databit[2]">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="databit[3]">
        <info>
            <xsl:apply-templates/>
        </info>
    </xsl:template>

    <xsl:template match="databit[3]/text()">
        <part key="{substring-before(., ':')}" value="{substring(substring-after(., ':'), 2)}"/>
    </xsl:template>

    <xsl:template match="databit[3]/br"/>

</xsl:stylesheet>

样式表上的一些要点

  • 所有元素都使用标识模板递归复制,除非该元素有自己的模板
  • 第三个<databit>元素中的所有文本节点都应该是键值对。
  • Attributes in <part> elements are added using an XPath expression inside braces (an attribute value template). Other method to add them is to use <xsl:attribute> element.
  • Element <br> is suppressed from copying by using an empty template.
于 2013-02-19T23:56:30.380 回答