如何XSLT转换XML嵌套属性元素并连接名称

如何XSLT转换XML嵌套属性元素并连接名称,xml,xslt,transformation,pubmed,Xml,Xslt,Transformation,Pubmed,我根本不懂XML/XSLT。我只是想学习如何将这个XML文件转换成Access数据库可以使用的东西。XML数据以属性格式输出,Access只喜欢元素格式。我已经完成了基本的转换,但似乎无法将嵌套数据元素化 我希望最终结果是所有元素。目前,我的XSLT脚本试图在子元素的名称中包含parentary name属性,但这可能不是必需的。如果我能在列表元素的名称中编号,那就太棒了。例如“AuthorList1”、“AuthorList2”或“Author1”、“Author2” 下面是我正在处理的XML

我根本不懂XML/XSLT。我只是想学习如何将这个XML文件转换成Access数据库可以使用的东西。XML数据以属性格式输出,Access只喜欢元素格式。我已经完成了基本的转换,但似乎无法将嵌套数据元素化

我希望最终结果是所有元素。目前,我的XSLT脚本试图在子元素的名称中包含parentary name属性,但这可能不是必需的。如果我能在列表元素的名称中编号,那就太棒了。例如“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

25587056
2015年1月13日
2015年1月13日
眼药水
王Q
图腾WS
卢扬北京
自适应光学显微视野计
56
25587056
iovs.14-15576
10.1167/iovs.14-15576
1.

您遇到的一个问题是匹配
项的模板

<xsl:template match="Item">
    <xsl:element name="{@Name}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>
另一个问题是与
child::Item
匹配的其他模板。我认为这也将匹配父
元素,因此有效地具有与其他
模板相同的优先级。您可能需要用以下内容替换匹配项:

<xsl:template match="Item[@Type='List']/Item">
这将
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>

您遇到的一个问题是与
项匹配的模板

<xsl:template match="Item">
    <xsl:element name="{@Name}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>
另一个问题是与
child::Item
匹配的其他模板。我认为这也将匹配父
元素,因此有效地具有与其他
模板相同的优先级。您可能需要用以下内容替换匹配项:

<xsl:template match="Item[@Type='List']/Item">
这将
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>


这非常有用!我在那里测试整个名称连接。谢谢你的帮助。这非常有帮助!我在那里测试整个名称连接。谢谢你的帮助。这非常有帮助!我在那里测试整个名称连接。谢谢你的帮助。