1

我正在为一个 XML 文件开发 XSLT,该文件具有一组特定“ID”的值。我需要通过我的转换器运行它,它将这些值输出到数据库,但我必须识别这些值是 ID。我需要识别这些值的是另一个文件中的描述。这个描述应该成为输出 XML 的元素名称,而不是我现在使用的 ID。相同的计数器 ID 位于单独的文件中,并包含我需要用作元素名称的描述。这是一个例子,以防我让你感到困惑。

<!-- XML with values -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <series>
        <sampleInfo>
            <timestamp>1/1/2013 12:00 AM</timestamp>
            <timestamp>1/2/2013 12:00 AM</timestamp>
            <timestamp>1/3/2013 12:00 AM</timestamp>
            <timestamp>1/4/2013 12:00 AM</timestamp>
        </sampleInfo>
        <value>
            <series>
                <value>
                    <int>0</int>
                    <int>9</int>
                    <int>0</int>
                    <int>9</int>
                </value>
                <id>
                    <counterID>100</counterID>
                    .
                    .
                </id>
            </series>
            <series>
                <value>
                    <int>3</int>
                    <int>6</int>
                    <int>3</int>
                    <int>6</int>
                </value>
                <id>
                    <counterID>120</counterID>
                    .
                    .
                    .
                </id>
            </series>
        </value>
    </series>
</root>

基本上,每个时间戳对于每个对应的 counterID 都有自己的值。现在这里是另一个 XML 文件的示例,我从中获取信息。

<!-- XML with descriptions -->
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
    <counterInfo>
        <id>100</id>
        <description>Blah</description>
    </counterInfo>
    <counterInfo>
        <id>120</id>
        <description>Derp</description>
    </counterInfo>
</root>

因此,一旦我转换了原始文档(带有值的文档),我的输出(平面)XML 看起来有点像:

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <C100>0</C100> <!-- Since XML doesn't allow numeric element fields, I add a C -->
        <C120>3</C120>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <C100>9</C100>
        <C120>6</C120>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <C100>0</C100>
        <C120>3</C120>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <C100>9</C100>
        <C120>6</C120>
    </element>
</root>

然后我需要做的是转换已经很平坦的 XML,就像上面一样,以显示它。

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <Blah>0</Blah>
        <Derp>3</Derp>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <Blah>9</Blah>
        <Derp>6</Derp>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <Blah>0</Blah>
        <Derp>3</Derp>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <Blah>9</Blah>
        <Derp>6</Derp>
    </element>
</root>

我做了一些搜索,大多数结果都建议参数,但我转换这些的方式可能会让这有点困难。我有一个 Java 转换器,它是大型转换器存储库的一部分,它从该存储库中提取 XSLT 以转换传递给它的文件。在转换器中,我们从档案中提取需要转换的文件,然后分别进行处理。所以我的问题是......当转换器到达列表中的那个文件时,我如何为 XSLT 提供该文件名,以及如何将该文件名传递给 XSLT?

那我是不是把事情复杂化了?有什么简单的方法可以做到这一点吗?让我知道是否需要清理任何东西。

4

1 回答 1

1

打开文档非常简单,并且可以参数化。但是创建一个元素名称是“C”连接一些数字(例如,“C100”)是一个可怕的、可怕的、可怕的想法。为什么?因为很难(在 xsl 中)找到这些节点;此外,“C100”“C125”节点会吹掉任何创建模式的尝试。

不要创建自己的元素,而是使用属性:<descr id="100">0</descr>

输入 XML (file.xml)

好的,所以,这是一个使用 descr 元素的 xml:

<root>
    <element>
        <timestamp>1/1/2013 12:00 AM</timestamp>
        <descr id="100">0</descr>
        <descr id="120">3</descr>
    </element>
    <element>
        <timestamp>1/2/2013 12:00 AM</timestamp>
        <descr id="100">9</descr>
        <descr id="120">6</descr>
    </element>
    <element>
        <timestamp>1/3/2013 12:00 AM</timestamp>
        <descr id="100">0</descr>
        <descr id="120">3</descr>
    </element>
    <element>
        <timestamp>1/4/2013 12:00 AM</timestamp>
        <descr id="100">9</descr>
        <descr id="120">6</descr>
    </element>
</root>

描述 XML (descriptions.xml)

<root>
    <counterInfo>
        <id>100</id>
        <description>Blah</description>
    </counterInfo>
    <counterInfo>
        <id>120</id>
        <description>Derp</description>
    </counterInfo>
</root>

XSL

最后,合并它们的样式表:

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

    <xsl:param name="descrDoc" select="'descriptions.xml'" />

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

    <xsl:template match="descr">
      <xsl:variable name="nodeName">
        <xsl:value-of select="document($descrDoc)/*/counterInfo[ id = current()/@id ]/description" />
      </xsl:variable>
      <xsl:if test="string-length($nodeName)=0">
        <xsl:message terminate="yes">No description! Failed.</xsl:message>
      </xsl:if>
      <xsl:element name="{$nodeName}">
        <xsl:apply-templates />
      </xsl:element>
    </xsl:template>

</xsl:stylesheet>
于 2013-03-05T18:29:41.490 回答