如何在XML中选择属性值并将其与字符串连接,并使用XSLT将其用作新XML中的属性值

时间:2015-07-02 06:42:12

标签: c# xml parsing xslt xml-parsing

我需要使用XSLT将现有XML转换为另一个XML。

我面临的问题是我需要使用" typeName"来自ECClass的属性并将其与http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#

连接起来

我正在使用的XML是 -

<ECSchema>
    <ECClass typeName="ABC">
        <BaseClass>PQR</BaseClass>
        <BaseClass>XYZ</BaseClass>
    </ECClass>
    <ECClass typeName="IJK">
        <BaseClass>MNO</BaseClass>
        <BaseClass>DEF</BaseClass>
    </ECClass>
<ECSchema>

例如,连接结果应为 -

第一个ECClass

http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#ABC

我需要在新XML结构的owl:class标记中将此字符串设置为rdf:about的属性值。

新的XML结构是 -

<owl:ontology rdf:about="http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1">
    <owl:class rdf:about="http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#ABC">
    </owl:class>
    <owl:class rdf:about="http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#ABC">
    </owl:class>
</owl:ontology>

现在我还没有尝试过对BaseClass做任何事情。我只是试图将ECCLass转换为owl:class。

它的XSL是 -

<xsl:template match="/">

    <owl:Ontology rdf:about="http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1"/>

    <xsl:for-each select="ECSchema/ECClass">
        <owl:class rdf:about="<xsl:value-of select="concat('http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#' , '@typeName') />" >
        </owl:class>
    </xsl:for-each>

</xsl:template>

我一直在尝试多种组合来从各种来源做到这一点但是还没有能够做到这一点。

它始终返回错误 - &#34; 附加信息:&#39;&lt;&#;;十六进制值0x3C,是无效的属性字符。&#34;

任何人都可以帮我解决这个问题,因为我是XSLT的新手,而且我所得到的都是很多错误。

1 个答案:

答案 0 :(得分:0)

标签不能嵌套。为了实现您的目的,您应该了解attribute value templates。此外,您的代码相当邋。。试试这种方式:

<xsl:template match="/">
    <owl:Ontology rdf:about="http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1">
        <xsl:for-each select="ECSchema/ECClass">
            <owl:class rdf:about="{concat('http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1#', @typeName)}" />
        </xsl:for-each>
    </owl:Ontology>
</xsl:template>

或者可能更优雅一点:

<xsl:variable name="myURL">http://www.semanticweb.org/aman.prasad/ontologies/2015/5/untitled-ontology-1</xsl:variable>

<xsl:template match="/">
    <owl:Ontology rdf:about="{$myURL}">
        <xsl:for-each select="ECSchema/ECClass">
            <owl:class rdf:about="{$myURL}#{@typeName}" />
        </xsl:for-each>
    </owl:Ontology>
</xsl:template>