我遇到的问题是没有与某些数据关联的有用标签,数据包含在文档的头部,但我无法看到我想要的内容。
我已经将Column1文本替换为标签,但由于它们都被标记,所以它没有多大帮助。我正在慢慢了解XSLT是如何工作的,但这是我所不知道的。
任何帮助都将不胜感激。
输入数据
<results>
<header>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
</body>
</results>
&GT;
必填XML
<?xml version="1.0"?>
<results>
<header>
<a>Column 1 Customer Name</a>
<a>Column 2 Customer Add</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
<line>
<Column1CustomerName>Data1</Column1CustomerName>
<Column2CustomerAdd>Data2</Column2CustomerAdd>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
</body>
</results>
继用户响应之后,我实现了以下XSLT:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/results">
<results>
<xsl:copy-of select="header"/>
<body>
<xsl:for-each select="body/line">
<line>
<xsl:for-each select="a">
<xsl:variable name="index" select="position()" />
<xsl:element name="{//header/a[$index]}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</line>
</xsl:for-each>
</body>
</results>
</xsl:template>
</xsl:stylesheet>
我现在的问题是如果标题包含空格,因为这会导致样式表尝试创建一个空格为的XML标记。
我已尝试使用已建议的替换功能。
<xsl:element name="{replace(//cols/c[$index],' ','')}">
我似乎弄错了,或者把它称为错误的地方。
感谢大家的投入。
答案 0 :(得分:2)
你需要<xsl:element>
才能做到这一点。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:template match="/results">
<results>
<xsl:copy-of select="header"/>
<body>
<xsl:for-each select="body/line">
<line>
<xsl:for-each select="a">
<xsl:variable name="index" select="position()" />
<xsl:element name="{replace(//header/a[$index], ' ', '')}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</line>
</xsl:for-each>
</body>
</results>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:1)
这是一个完全“推送导向”(重点关注<xsl:template>
和<xsl:apply-templates>
的使用,不会明确地使用<xsl:value-of>
等元素来提取数据。不要使用<xsl:for-each>
。
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="line/a">
<xsl:variable name="vPos" select="position()" />
<xsl:element name="{/*/header/a[$vPos]}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
...适用于提供的XML:
<results>
<header>
<a>Column1</a>
<a>Column2</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
<line>
<a>Data1</a>
<a>Data2</a>
<a>Data3</a>
<a>Data4</a>
</line>
</body>
</results>
...产生了想要的答案:
<?xml version="1.0"?>
<results>
<header>
<a>Column1</a>
<a>Column2</a>
<a>Column3</a>
<a>Column4</a>
</header>
<body>
<line>
<Column1>Data1</Column1>
<Column2>Data2</Column2>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
<line>
<Column1>Data1</Column1>
<Column2>Data2</Column2>
<Column3>Data3</Column3>
<Column4>Data4</Column4>
</line>
</body>
</results>