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