我試圖使用XSLT 1.0來轉換節點並將其複製到一個新節點,然後使用它的一個屬性作爲其值,但它創建了多個節點重寫一個並創建一個額外的,我該如何解決這個問題?當應用XSLT時重複節點
下面是我感興趣的節點是'unitid'的數據示例部分。應將此節點的值複製到新節點「physloc」,並將「unitid」值更改爲「id」屬性。
現有輸入:
<c03 level="subseries">
<did>
<unitid encodinganalog="isadg311" id="cnda.94.02.02">D1148/2/2</unitid>
<unittitle encodinganalog="isadg312 marc245">Bundle</unittitle>
<unitdate encodinganalog="isadg313 marc260" normal="19350701/19750108">1 Jul 1935-8 Jan 1975; n.d.</unitdate>
<physdesc encodinganalog="isadg315 marc300">
<extent>1 bundle; 11 items.</extent>
<genreform />
<physfacet />
</physdesc>
</did>
期望的結果:
<c03 level="subseries">
<did>
<unitid encodinganalog="isadg311">cnda.94.02.02</unitid>
<unittitle encodinganalog="isadg312 marc245">Bundle</unittitle>
<unitdate encodinganalog="isadg313 marc260" normal="19350701/19750108">1 Jul 1935-8 Jan 1975; n.d.</unitdate>
<physdesc encodinganalog="isadg315 marc300">
<extent>1 bundle; 11 items.</extent>
<genreform />
<physfacet />
</physdesc>
<physloc>D1148/2/2</physloc>
</did>
一些一般性的問題,並非所有的「單元ID」節點有一個「id」屬性並在這樣的情況下,' unitid'值應該被保留。此外,還有一些記錄,其中這個「id」屬性是在「做」節點,例如
<did id="uni.07.01.06.14">
<unitid encodinganalog="isadg311">P4A/5/9</unitid>
在這種情況下從「做」節點的「id」屬性應成爲價值「的UnitID」 'unitid'的值被設置爲'physloc',例如
<did>
<unitid encodinganalog="isadg311">uni.07.01.06.14</unitid>
<physloc>P4A/5/9</physloc>
我現在的樣式表是這樣的:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*" />
</xsl:copy>
</xsl:template>
<xsl:template match="did">
<xsl:param name="physid" select="unitid"/>
<xsl:param name="eadid">
<xsl:choose>
<xsl:when test="@id">
<xsl:value-of select="@id" />
</xsl:when>
<xsl:when test="unitid/@id">
<xsl:value-of select="unitid/@id"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="unitid"/>
</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:copy>
<xsl:copy-of select="*" />
<physloc><xsl:value-of select="$physid" /></physloc>
<unitid><xsl:value-of select="$eadid" /></unitid>
</xsl:copy>
</xsl:template>
對於那裏是在 '單元ID' 結果沒有 '身份證' 屬性記錄是這樣的:
<did>
<repository encodinganalog="marc852">
<corpname>
University of Liverpool,
<subarea>Special Collections and Archives</subarea> </corpname>
</repository>
<unitid countrycode="GB" repositorycode="141" encodinganalog="isadg311">CNDA</unitid>
<physloc>CNDA</physloc>
<unitid>CNDA</unitid>
<physloc>CNDA</physloc>
<unitid>CNDA</unitid>
'unitid'中有'id':
<did>
<unitid encodinganalog="isadg311" id="cnda.94.01.17">D1148/1/17</unitid>
<unittitle encodinganalog="isadg312 marc245">Poem</unittitle>
<unitdate encodinganalog="isadg313 marc260" normal="19000101/19591231">n.d.</unitdate>
<physdesc encodinganalog="isadg315 marc300">
<extent>1 item; 2 pieces.</extent>
<genreform/>
<physfacet/>
</physdesc>
<physloc>D1148/1/17</physloc>
<unitid>cnda.94.01.17</unitid>
<physloc>D1148/1/17</physloc>
<unitid>cnda.94.01.17</unitid>
</did>
,並在「做」節點,那裏有一個「身份證」:
<did>
<unitid encodinganalog="isadg311">D1148/2/2</unitid>
<unittitle encodinganalog="isadg312 marc245">Bundle</unittitle>
<unitdate encodinganalog="isadg313 marc260" normal="19350701/19750108">1 Jul 1935-8 Jan 1975; n.d.</unitdate>
<physdesc encodinganalog="isadg315 marc300">
<extent>1 bundle; 11 items.</extent>
<genreform/>
<physfacet/>
</physdesc>
<physloc>D1148/2/2</physloc>
<unitid>cnda.94.02.02</unitid>
<physloc>D1148/2/2</physloc>
<unitid>D1148/2/2</unitid>
</did>
如何改變我的樣式,這樣我只得到一個「單元ID」和「physloc」正確的值?我正在使用的XML文件是嵌套的,'unitid'節點可以出現在多個層次上。
爲什麼downvote而不解釋爲什麼?不是很有幫助。 – joesch
我只能猜測這是因爲問題是以一種相當混亂的方式寫的。技術上所有東西都在那裏(輸入,期望輸出,當前嘗試,問題描述),但主觀上這個問題有點壓倒性。 – Tomalak
公平點 - 我會盡量更具描述性而不會失去技術上的必需品。 – joesch