如何 XSLT 转换 XML 嵌套属性元素并连接名称
How to XSLT transform XML nested attribute elements and concatenate name
我根本不了解 XML/XSLT。我只是想学习足够的知识来将这个 XML 文件转换成我的 Access 数据库可以使用的东西。 XML 数据以属性格式输出,Access 只喜欢元素格式。我有基本的转换,但我似乎无法元素化嵌套数据。
我希望最终结果是所有元素。目前,我的 XSLT 脚本试图在 child 元素的名称中包含父母姓名属性,但这可能不是必需的。如果我可以在它们的名称中对列表元素进行编号,那就太棒了。如"AuthorList1"、"AuthorList2"或"Author1"、"Author2".
这是我正在处理的 XML 类型(缩写):
XML
<Result>
<DocSum>
<Id>25587056</Id>
<Item Name="PubDate" Type="Date">2015 Jan 13</Item>
<Item Name="EPubDate" Type="Date">2015 Jan 13</Item>
<Item Name="Source" Type="String">Invest Ophthalmol Vis Sci</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Wang Q</Item>
<Item Name="Author" Type="String">Tuten WS</Item>
<Item Name="Author" Type="String">Lujan BJ</Item>
</Item>
<Item Name="Title" Type="String">Adaptive optics microperimetry</Item>
<Item Name="Volume" Type="String">56</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="pubmed" Type="String">25587056</Item>
<Item Name="pii" Type="String">iovs.14-15576</Item>
<Item Name="doi" Type="String">10.1167/iovs.14-15576</Item>
</Item>
<Item Name="References" Type="List"></Item>
<Item Name="HasAbstract" Type="Integer">1</Item>
</DocSum>
</Result
我对 XSLT 的了解已经很深了,但还没有完全了解。不断出现的一个问题是空元素(如引用)获得不允许的空名称。当我尝试使用匹配模式 "Item[@Type='List']" 的命令时,就会发生这种情况。另外,我似乎无法让列表的 child 个节点(元素?)成为它们自己的元素。
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*" >
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="child::Item">
<xsl:variable name="Parent" select="TEST"/>
<xsl:element name="{$Parent}{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我希望这是有道理的。我真的不想成为这方面的专家,因为我怀疑我会在很长一段时间内再次处理 XML 转换。我将不胜感激任何即将到来的帮助。
您遇到的一个问题是与 Item
匹配的模板
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
在这里使用xsl:value-of
,它不会继续处理任何子节点,因此您不会对任何子Item
元素进行任何匹配。您需要在此处使用 xsl:apply-templates
,以允许模板应用于子项
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
另一个问题与匹配 child::Item
的另一个模板有关。我认为这也将匹配父 Item
元素,因此实际上与其他 Item
模板具有相同的优先级。您可能需要将匹配项替换为:
<xsl:template match="Item[@Type='List']/Item">
最后,您在此模板中定义 Parent
变量,如下所示:
<xsl:variable name="Parent" select="TEST"/>
这会将 Parent
设置为名为 TEST
的元素的值,而您可能只需要 "Test" 的字面值。所以,你应该这样定义它
<xsl:variable name="Parent" select="'TEST'"/>
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*" >
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="Item[@Type='List']/Item">
<xsl:variable name="Parent" select="'TEST'"/>
<xsl:element name="{$Parent}{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我根本不了解 XML/XSLT。我只是想学习足够的知识来将这个 XML 文件转换成我的 Access 数据库可以使用的东西。 XML 数据以属性格式输出,Access 只喜欢元素格式。我有基本的转换,但我似乎无法元素化嵌套数据。
我希望最终结果是所有元素。目前,我的 XSLT 脚本试图在 child 元素的名称中包含父母姓名属性,但这可能不是必需的。如果我可以在它们的名称中对列表元素进行编号,那就太棒了。如"AuthorList1"、"AuthorList2"或"Author1"、"Author2".
这是我正在处理的 XML 类型(缩写):
XML
<Result>
<DocSum>
<Id>25587056</Id>
<Item Name="PubDate" Type="Date">2015 Jan 13</Item>
<Item Name="EPubDate" Type="Date">2015 Jan 13</Item>
<Item Name="Source" Type="String">Invest Ophthalmol Vis Sci</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Wang Q</Item>
<Item Name="Author" Type="String">Tuten WS</Item>
<Item Name="Author" Type="String">Lujan BJ</Item>
</Item>
<Item Name="Title" Type="String">Adaptive optics microperimetry</Item>
<Item Name="Volume" Type="String">56</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="pubmed" Type="String">25587056</Item>
<Item Name="pii" Type="String">iovs.14-15576</Item>
<Item Name="doi" Type="String">10.1167/iovs.14-15576</Item>
</Item>
<Item Name="References" Type="List"></Item>
<Item Name="HasAbstract" Type="Integer">1</Item>
</DocSum>
</Result
我对 XSLT 的了解已经很深了,但还没有完全了解。不断出现的一个问题是空元素(如引用)获得不允许的空名称。当我尝试使用匹配模式 "Item[@Type='List']" 的命令时,就会发生这种情况。另外,我似乎无法让列表的 child 个节点(元素?)成为它们自己的元素。
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*" >
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="child::Item">
<xsl:variable name="Parent" select="TEST"/>
<xsl:element name="{$Parent}{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我希望这是有道理的。我真的不想成为这方面的专家,因为我怀疑我会在很长一段时间内再次处理 XML 转换。我将不胜感激任何即将到来的帮助。
您遇到的一个问题是与 Item
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
在这里使用xsl:value-of
,它不会继续处理任何子节点,因此您不会对任何子Item
元素进行任何匹配。您需要在此处使用 xsl:apply-templates
,以允许模板应用于子项
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
另一个问题与匹配 child::Item
的另一个模板有关。我认为这也将匹配父 Item
元素,因此实际上与其他 Item
模板具有相同的优先级。您可能需要将匹配项替换为:
<xsl:template match="Item[@Type='List']/Item">
最后,您在此模板中定义 Parent
变量,如下所示:
<xsl:variable name="Parent" select="TEST"/>
这会将 Parent
设置为名为 TEST
的元素的值,而您可能只需要 "Test" 的字面值。所以,你应该这样定义它
<xsl:variable name="Parent" select="'TEST'"/>
试试这个 XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*" >
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Item">
<xsl:element name="{@Name}">
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<xsl:template match="Item[@Type='List']/Item">
<xsl:variable name="Parent" select="'TEST'"/>
<xsl:element name="{$Parent}{@Name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>