我的XML是这样的:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2013-07-30T00:13:32" EndDate="2013-07-30T00:13:29" StartDate="2013-07-29T23:13:29" Version="12.2.4 Build(92)">
<Rowset>
<Columns>
<Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="-9" SourceColumn="Name"/>
<Column Description="Value" MaxRange="1" MinRange="0" Name="Value" SQLDataType="-9" SourceColumn="Value"/>
<Column Description="Min" MaxRange="1" MinRange="0" Name="Min" SQLDataType="2" SourceColumn="Min"/>
<Column Description="Max" MaxRange="1" MinRange="0" Name="Max" SQLDataType="2" SourceColumn="Max"/>
<Column Description="ObjectDisplay" MaxRange="1" MinRange="0" Name="ObjectDisplay" SQLDataType="12" SourceColumn="ObjectDisplay"/>
<Column Description="Datatype" MaxRange="1" MinRange="0" Name="Datatype" SQLDataType="-9" SourceColumn="Datatype"/>
</Columns>
<Row>
<Name>Tank</Name>
<Value>T111</Value>
<Min>1</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Material</Name>
<Value>111-Bulk</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Batch</Name>
<Value>1111111</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
</Rowset>
<Rowset>
<Columns>
<Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="-9" SourceColumn="Name"/>
<Column Description="Value" MaxRange="1" MinRange="0" Name="Value" SQLDataType="-9" SourceColumn="Value"/>
<Column Description="Min" MaxRange="1" MinRange="0" Name="Min" SQLDataType="2" SourceColumn="Min"/>
<Column Description="Max" MaxRange="1" MinRange="0" Name="Max" SQLDataType="2" SourceColumn="Max"/>
<Column Description="ObjectDisplay" MaxRange="1" MinRange="0" Name="ObjectDisplay" SQLDataType="12" SourceColumn="ObjectDisplay"/>
<Column Description="Datatype" MaxRange="1" MinRange="0" Name="Datatype" SQLDataType="-9" SourceColumn="Datatype"/>
</Columns>
<Row>
<Name>Tank</Name>
<Value>T222</Value>
<Min>1</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Material</Name>
<Value>222-Bulk</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Batch</Name>
<Value>2222222</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
</Rowset>
</Rowsets>
我使用以下XSLT来转换上面提到的XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes"/>
<!-- <xsl:strip-space elements="*"/>-->
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="@*"/>
<Rowset>
<Columns>
<xsl:apply-templates mode="cols" select="Rowset[1]/Row"/>
</Columns>
<xsl:apply-templates select="Rowset"/>
</Rowset>
</xsl:copy>
</xsl:template>
<xsl:template match="Row" mode="cols">
<Column Description="" MaxRange="1" MinRange="0" Name="{Name}" SQLDataType="1" SourceColumn="{Name}"/>
</xsl:template>
<xsl:template match="Rowset">
<Row>
<xsl:apply-templates select="Row/Name"/>
</Row>
</xsl:template>
<xsl:template match="Name">
<xsl:element name="{.}">
<xsl:value-of select="../Value"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我得到以下内容:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2013-07-30T00:13:32" EndDate="2013-07-30T00:13:29" StartDate="2013-07-29T23:13:29" Version="12.2.4 Build(92)">
<Rowset>
<Columns>
<Column Description="" MaxRange="1" MinRange="0" Name="Tank" SQLDataType="1" SourceColumn="Tank"/>
<Column Description="" MaxRange="1" MinRange="0" Name="Material" SQLDataType="1" SourceColumn="Material"/>
<Column Description="" MaxRange="1" MinRange="0" Name="Batch" SQLDataType="1" SourceColumn="Batch"/>
</Columns>
<Row>
<Tank>T111</Tank>
<Material>111-Bulk</Material>
<Batch>1111111</Batch>
</Row>
<Row>
<Tank>T222</Tank>
<Material>222-Bulk</Material>
<Batch>2222222</Batch>
</Row>
</Rowset>
</Rowsets>
但是现在当我关注XML并运行XSLT时,我给出了下面提到的错误:
XML:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Rowsets CachedTime="" DateCreated="2013-07-30T00:13:32" EndDate="2013-07-30T00:13:29" StartDate="2013-07-29T23:13:29" Version="12.2.4 Build(92)">
<Rowset>
<Columns>
<Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="-9" SourceColumn="Name"/>
<Column Description="Value" MaxRange="1" MinRange="0" Name="Value" SQLDataType="-9" SourceColumn="Value"/>
<Column Description="Min" MaxRange="1" MinRange="0" Name="Min" SQLDataType="2" SourceColumn="Min"/>
<Column Description="Max" MaxRange="1" MinRange="0" Name="Max" SQLDataType="2" SourceColumn="Max"/>
<Column Description="ObjectDisplay" MaxRange="1" MinRange="0" Name="ObjectDisplay" SQLDataType="12" SourceColumn="ObjectDisplay"/>
<Column Description="Datatype" MaxRange="1" MinRange="0" Name="Datatype" SQLDataType="-9" SourceColumn="Datatype"/>
</Columns>
<Row>
<Name>Tank Tag</Name>
<Value>T111</Value>
<Min>1</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Material</Name>
<Value>111-Bulk</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Batch</Name>
<Value>1111111</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
</Rowset>
<Rowset>
<Columns>
<Column Description="Name" MaxRange="1" MinRange="0" Name="Name" SQLDataType="-9" SourceColumn="Name"/>
<Column Description="Value" MaxRange="1" MinRange="0" Name="Value" SQLDataType="-9" SourceColumn="Value"/>
<Column Description="Min" MaxRange="1" MinRange="0" Name="Min" SQLDataType="2" SourceColumn="Min"/>
<Column Description="Max" MaxRange="1" MinRange="0" Name="Max" SQLDataType="2" SourceColumn="Max"/>
<Column Description="ObjectDisplay" MaxRange="1" MinRange="0" Name="ObjectDisplay" SQLDataType="12" SourceColumn="ObjectDisplay"/>
<Column Description="Datatype" MaxRange="1" MinRange="0" Name="Datatype" SQLDataType="-9" SourceColumn="Datatype"/>
</Columns>
<Row>
<Name>Tank Tag</Name>
<Value>T222</Value>
<Min>1</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Material</Name>
<Value>222-Bulk</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
<Row>
<Name>Batch</Name>
<Value>2222222</Value>
<Min>7</Min>
<Max>20</Max>
<ObjectDisplay>Enabled</ObjectDisplay>
<Datatype>String</Datatype>
</Row>
</Rowset>
</Rowsets>
错误:
[ERROR] [XSLSingleTableTransformation]XSLTransform error: java.lang.RuntimeException: An attribute whose value must be a QName had the value 'Tank Tag'
如何删除此错误?
如果此错误是由于坦克和标签之间的空间造成的,那么 1)我可以获得带空格的XML标签名称吗? 2)如果没有,我怎么能删除那个空格而不是“ - ”
答案 0 :(得分:6)
你只需要改变这个:
<xsl:template match="Name">
<xsl:element name="{.}">
进入这个:
<xsl:template match="Name">
<xsl:element name="{translate(., ' ' , '_')}">
这会将名称中的空格转换为下划线。请注意,对于可用作元素名称的内容还有其他限制,因此这可能不是它的结尾。
答案 1 :(得分:4)
标记名称不能包含空格。您可以使用replace
函数将连字符替换为空格。
如果你可以使用XSLT 2,那么很简单
<xsl:template match="Name">
<xsl:element name="{replace(.,' ','-')}">
<xsl:value-of select="../Value"/>
</xsl:element>
</xsl:template>
对于XSLT 1,它有点复杂,你必须使用EXSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:str="http://exslt.org/strings"
extension-element-prefixes="str">
...
<xsl:template match="Name">
<xsl:element name="{str:replace(.,' ','-')}">
<xsl:value-of select="../Value"/>
</xsl:element>
</xsl:template>
...