Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用XSLT从指定文件中选择值_Java_Xml_Xslt - Fatal编程技术网

Java 使用XSLT从指定文件中选择值

Java 使用XSLT从指定文件中选择值,java,xml,xslt,Java,Xml,Xslt,我正在研究一个XML文件的XSLT,该文件有一组特定“ID”的值。我需要通过我的转换器运行它,它将这些值输出到数据库,但是我需要识别的只是ID。我需要识别的是另一个文件中的描述。这个描述应该成为输出XML的元素名,而不是我现在使用的ID。相同的计数器ID在单独的文件中,包含我需要用作元素名称的描述。这里有一个例子,以防万一我把你弄糊涂了 <!-- XML with values --> <?xml version="1.0" encoding="ISO-8859-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>

2013年1月1日上午12:00
2013年1月2日上午12:00
2013年1月3日上午12:00
2013年1月4日上午12:00
0
9
0
9
100
.
.
3.
6.
3.
6.
120
.
.
.
基本上,每个时间戳对于每个对应的计数器ID都有自己的值。下面是另一个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>

100
废话
120
德普
因此,转换原始文档(带值的文档)后,我的输出(平面)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>

2013年1月1日上午12:00
0
3.
2013年1月2日上午12:00
9
6.
2013年1月3日上午12:00
0
3.
2013年1月4日上午12:00
9
6.
然后我需要做的是转换已经很扁平的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>

2013年1月1日上午12:00
0
3.
2013年1月2日上午12:00
9
6.
2013年1月3日上午12:00
0
3.
2013年1月4日上午12:00
9
6.
我做了一些搜索,大多数结果都建议使用参数,但我转换这些参数的方式可能会使这有点困难。我有一个Java转换器,它是大型转换器存储库的一部分,它从该存储库中提取XSLT来转换传递给它的文件。在转换器中,我们从归档文件中提取需要转换的文件,然后分别进行转换。所以我的问题是。。。当转换器到达列表中的该文件时,如何向XSLT提供该文件名,以及如何将该文件名传递给XSLT


我是不是把事情复杂化了?有什么简单的方法可以做到这一点吗?如果需要清除任何内容,请告诉我。

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

不要创建自己的元素,而是使用属性:
0

输入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>

2013年1月1日上午12:00
0
3.
2013年1月2日上午12:00
9
6.
2013年1月3日上午12:00
0
3.
2013年1月4日上午12:00
9
6.
描述XML(descriptions.XML)

100
废话
120
德普
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>

没有描述!失败。

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

不要创建自己的元素,而是使用属性:
0

输入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>

2013年1月1日上午12:00
0
3.
2013年1月2日上午12:00
9
6.
2013年1月3日上午12:00
0
3.
2013年1月4日上午12:00
9
6.
描述XML(descriptions.XML)

100
废话
120
德普
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>

没有描述!失败。

到目前为止,您拥有的XSLT在哪里?要将文件名传递到XSLT中,可以使用XSLT参数,然后可以将此参数传递到
document()
函数以访问文件内容。演示如何在Java中使用XSLT参数。XSLT位于Eclipse中的一个项目中,该项目取自SVN存储库。当转换器运行时,init()函数为每个特定文件获取适当的转换器,然后运行这些转换器。转换器获取XSLT样式表并根据分配给它的文件运行它。这些文件本身是从存档(7z、zip等)中提取的,经过转换(展平),然后转换为CSV文件并重新存档。这些文件没有实际位置,在转换器运行时存储为文件对象。。。看到我的困境了吗?到目前为止,XSLT在哪里?要将文件名传递到XSLT中,可以使用XSL