我有一些 XML(我無法控制),其中包含一些“rdf”注釋。我正在嘗試將其轉換為實際可用的 RDF/XML(使用 XSLT),但是有一個我不太知道如何解決的問題。首先,在 XML 中有很長的部分,如下所示:
<rdf:Description>
<some:tag>
<rdf:Bag>
<rdf:li rdf:resource="resource1" />
</rdf:Bag>
</some:tag>
<some:other-tag>
<rdf:Bag>
<rdf:li rdf:resource="resource2" />
<rdf:li rdf:resource="resource3" />
</rdf:Bag>
</some:other-tag>
</rdf:Description>
目標是像這樣創建 RDF/XML:
<rdf:Description>
<some:tag>resource1</some:tag>
<some:other-tag>resource2<some:other-tag>
<some:other-tag>resource3<some:other-tag>
</rdf:Description>
然而,不同標簽的數量可能是無限的,所以我不能在這里列舉不同的情況。我需要一些通用的方法來使用包周圍的標簽作為各個資源屬性的封閉標簽。
不幸的是,我真的不太了解 XSLT,所以我在這里不知所措。
不幸的是,到目前為止我所做的對 的情況不起作用some:other-tag,因為我只得到一個三元組,其中物件是連接的:
<some:other-tag>resource2resource3</some:other-tag>
<xsl:template match="rdf:Description/*">
<xsl:copy>
<xsl:for-each select="rdf:Bag/rdf:li/@rdf:resource">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
uj5u.com熱心網友回復:
我將從身份轉換模板開始(例如,在 XSLT 3 中只需宣告<xsl:mode on-no-match="shallow-copy"/>),然后添加兩個模板
<xsl:template match="*[rdf:Bag]| rdf:Bag">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="rdf:Bag/rdf:*">
<xsl:element name="{name(../..)}" namespace="{namespace-uri(../..)}">{@rdf:resource}</xsl:element>
</xsl:template>
那應該給例如
<rdf:Description xmlns:rdf="http://example.com/rdf" xmlns:some="http://example.com/some">
<some:tag>resource1</some:tag>
<some:other-tag>resource2</some:other-tag>
<some:other-tag>resource3</some:other-tag>
</rdf:Description>
對于像這樣的輸入
<rdf:Description xmlns:rdf="http://example.com/rdf" xmlns:some="http://example.com/some">
<some:tag>
<rdf:Bag>
<rdf:li rdf:resource="resource1" />
</rdf:Bag>
</some:tag>
<some:other-tag>
<rdf:Bag>
<rdf:li rdf:resource="resource2" />
<rdf:li rdf:resource="resource3" />
</rdf:Bag>
</some:other-tag>
</rdf:Description>
您還沒有真正展示命名空間,也沒有告訴我們是否還有其他元素而不是rdf:Bar,如果有,它們需要如何轉換。
uj5u.com熱心網友回復:
好的,我想出了一種將其撰寫為遞回程序的方法。如果有人過來告訴我有一個更簡潔、更慣用的版本,我仍然會很高興,但是,在偶然的情況下,這可以幫助某人,給你:
<xsl:template name="bonkers">
<xsl:param name="rs" required="yes"/>
<xsl:copy copy-namespaces="no">
<xsl:value-of select="subsequence($rs, 1, 1)"/>
</xsl:copy>
<xsl:if test="false() = empty($rs)">
<xsl:call-template name="bonkers">
<xsl:with-param name="rs" select="subsequence($rs, 2)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="rdf:Description/*">
<xsl:variable name="resources" select="rdf:Bag/rdf:li/@rdf:resource"/>
<xsl:call-template name="bonkers">
<xsl:with-param name="rs" select="$resources"/>
</xsl:call-template>
</xsl:template>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391146.html
上一篇:替換XSL中的HTML標簽
下一篇:在Powershell中將UFT-8xml轉換為Unicode時,$encoding屬性值在輸出xml中顯示bigEndianUnicode,我想要UTF-16
