2017-04-13 45 views
0

源XML文檔:改變xlmns值,而無需修改使用XSLT的前綴(帶有內置模板)

<?xml version="1.0" encoding="UTF-8"?> 
<PREMIS:premis xmlns:PREMIS="info:lc/xmlns/premis-v2" version="2.2"> 
    <PREMIS:object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="PREMIS:file"> 
     <PREMIS:objectIdentifier> 
      <PREMIS:objectIdentifierType>Docuteam</PREMIS:objectIdentifierType> 
      <PREMIS:objectIdentifierValue>_20161027171024801</PREMIS:objectIdentifierValue> 
     </PREMIS:objectIdentifier> 
     <PREMIS:objectCharacteristics> 
      <PREMIS:compositionLevel>0</PREMIS:compositionLevel> 
      <PREMIS:fixity> 
       <PREMIS:messageDigestAlgorithm>SHA-512</PREMIS:messageDigestAlgorithm> 
       <PREMIS:messageDigest>2b9be7ebeae4135b0002cfcd7ee4ee2f5d93e80bfabebf6d5d409e504ad1cbd920487f56726362c2a2979b68d96b1c26f37a73e68c30dd9f8cf11502c634ff5a</PREMIS:messageDigest> 
      </PREMIS:fixity> 
      <PREMIS:size>32783388</PREMIS:size> 
      <PREMIS:format> 
       <PREMIS:formatDesignation> 
        <PREMIS:formatName>Tagged Image File Format</PREMIS:formatName> 
       </PREMIS:formatDesignation> 
       <PREMIS:formatRegistry> 
        <PREMIS:formatRegistryName>PRONOM</PREMIS:formatRegistryName> 
        <PREMIS:formatRegistryKey>fmt/353</PREMIS:formatRegistryKey> 
       </PREMIS:formatRegistry> 
      </PREMIS:format> 
     </PREMIS:objectCharacteristics> 
     <PREMIS:originalName xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" 
      >12448399.tif</PREMIS:originalName> 
    </PREMIS:object> 
    <PREMIS:event> 
     <PREMIS:eventIdentifier> 
      <PREMIS:eventIdentifierType>Docuteam</PREMIS:eventIdentifierType> 
      <PREMIS:eventIdentifierValue>_20161027171025082</PREMIS:eventIdentifierValue> 
     </PREMIS:eventIdentifier> 
     <PREMIS:eventType>Creation</PREMIS:eventType> 
     <PREMIS:eventDateTime>2016-10-27T17:10:25</PREMIS:eventDateTime> 
     <PREMIS:eventDetail>Performed by: &apos;INGEST-01$&apos;</PREMIS:eventDetail> 
     <PREMIS:eventOutcomeInformation> 
      <PREMIS:eventOutcome>Success</PREMIS:eventOutcome> 
     </PREMIS:eventOutcomeInformation> 
     <PREMIS:linkingObjectIdentifier xmlns:xlink="http://www.w3.org/1999/xlink" 
      xlink:type="simple"> 
      <PREMIS:linkingObjectIdentifierType>Docuteam</PREMIS:linkingObjectIdentifierType> 
      <PREMIS:linkingObjectIdentifierValue>_20161027171024801</PREMIS:linkingObjectIdentifierValue> 
     </PREMIS:linkingObjectIdentifier> 
    </PREMIS:event> 
    <PREMIS:event> 
     <PREMIS:eventIdentifier> 
      <PREMIS:eventIdentifierType>Docuteam</PREMIS:eventIdentifierType> 
      <PREMIS:eventIdentifierValue>_20161027171031973</PREMIS:eventIdentifierValue> 
     </PREMIS:eventIdentifier> 
     <PREMIS:eventType>Fixity Check</PREMIS:eventType> 
     <PREMIS:eventDateTime>2016-10-27T17:10:31</PREMIS:eventDateTime> 
     <PREMIS:eventDetail>Based on sa_ub-erara-01_dss-01. Performed by: 
      &apos;INGEST-01$&apos;</PREMIS:eventDetail> 
     <PREMIS:eventOutcomeInformation> 
      <PREMIS:eventOutcome>Success</PREMIS:eventOutcome> 
     </PREMIS:eventOutcomeInformation> 
     <PREMIS:linkingObjectIdentifier xmlns:xlink="http://www.w3.org/1999/xlink" 
      xlink:type="simple"> 
      <PREMIS:linkingObjectIdentifierType>Docuteam</PREMIS:linkingObjectIdentifierType> 
      <PREMIS:linkingObjectIdentifierValue>_20161027171024801</PREMIS:linkingObjectIdentifierValue> 
     </PREMIS:linkingObjectIdentifier> 
    </PREMIS:event> 
</PREMIS:premis> 

我的XSLT:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:PREMIS="info:lc/xmlns/premis-v2" 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" 
    > 
    <xsl:output method="xml"/> 
    <xsl:template match="/"> 
    <rdf:RDF> 
     <xsl:value-of select="'&#10;'"/> 
     <xsl:value-of select="'&#10;'"/> 
     <xsl:apply-templates/>  
    </rdf:RDF> 
    </xsl:template> 

    <xsl:template match="PREMIS:premis"> 
    <xsl:apply-templates select="PREMIS:object"/> 
    <xsl:value-of select="'&#10;'"/> 
    <xsl:apply-templates select="PREMIS:event"/> 
    <xsl:value-of select="'&#10;'"/> 
    </xsl:template> 

    <xsl:template match="PREMIS:object"> 

    <!-- Verknüpfung zwischen Fedora- und PREMIS-Objekt --> 
    <!-- Der Identifikator des Fedoraobjektes "info:fedora/CH-001898-1:X" ist nicht im PREMIS-XML gespeichert, sondern muss irgendwie extern eingefügt werden --> 

    <rdf:Description rdf:about="info:fedora/CH-001898-1:7"> 
     <PREMIS:hasObject><xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierValue"/></PREMIS:hasObject> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 

    <!-- PREMIS:object --> 
    <!-- Ebene1 --> 

    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierValue"/> 
     </xsl:attribute> 
     <PREMIS:hasIdentifier><xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierValue"/><xsl:text>objectIdentifier</xsl:text></PREMIS:hasIdentifier> 
     <PREMIS:hasOriginalName><xsl:value-of select="PREMIS:originalName"/></PREMIS:hasOriginalName> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 

    <!-- Ebene2 --> 

    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierValue"/><xsl:text>objectIdentifier</xsl:text></xsl:attribute> 
     <PREMIS:hasIdentifierType><xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierType"/></PREMIS:hasIdentifierType> 
     <PREMIS:hasIdentifierValue><xsl:value-of select="PREMIS:objectIdentifier/PREMIS:objectIdentifierValue"/></PREMIS:hasIdentifierValue> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 
    </xsl:template> 
    <!-- Events --> 
    <!-- Ebene1 --> 
    <xsl:template match="PREMIS:event">  
    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/></xsl:attribute> 
     <PREMIS:hasIdentifier><xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/></PREMIS:hasIdentifier> 
     <PREMIS:EventDateTime><xsl:value-of select="PREMIS:eventDateTime"/></PREMIS:EventDateTime> 
     <PREMIS:EventDetail><xsl:value-of select="PREMIS:eventDetail"/></PREMIS:EventDetail> 
     <PREMIS:hasEventOutcomeInformation><xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/><xsl:text>eventOutcomeInformation</xsl:text></PREMIS:hasEventOutcomeInformation> 
     <PREMIS:hasEventLinkingObjectIdentifier><xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/><xsl:text>eventLinkingObjectIdentifier</xsl:text></PREMIS:hasEventLinkingObjectIdentifier> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 

    <!-- Ebene2 --> 

    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/><xsl:text>eventIdentifier</xsl:text></xsl:attribute> 
     <PREMIS:hasIdentifierType><xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierType"/></PREMIS:hasIdentifierType> 
     <PREMIS:hasIdentifierValue><xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/></PREMIS:hasIdentifierValue> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 

    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/><xsl:text>eventOutcomeInformation</xsl:text></xsl:attribute> 
     <PREMIS:hasEventOutcome><xsl:value-of select="PREMIS:eventOutcomeInformation/PREMIS:eventOutcome"/></PREMIS:hasEventOutcome> 
    </rdf:Description> 

    <xsl:value-of select="'&#10;'"/> 

    <rdf:Description> 
     <xsl:attribute name="rdf:about"> 
     <xsl:value-of select="PREMIS:eventIdentifier/PREMIS:eventIdentifierValue"/><xsl:text>eventLinkingObjectIdentifier</xsl:text></xsl:attribute> 
     <PREMIS:linkingObjectIdentifierType><xsl:value-of select="PREMIS:linkingObjectIdentifier/PREMIS:linkingObjectIdentifierType"/></PREMIS:linkingObjectIdentifierType> 
     <PREMIS:hasLinkingObjectIdentifierValue><xsl:value-of select="PREMIS:linkingObjectIdentifier/PREMIS:linkingObjectIdentifierValue"/></PREMIS:hasLinkingObjectIdentifierValue> 
    </rdf:Description> 
    <xsl:value-of select="'&#10;'"/> 

    </xsl:template> 

</xsl:stylesheet> 

在輸出XML文檔我想要的價值xmlns:PREMIS將更改爲「http://www.loc.gov/premis/rdf/v1#」。所以開頭的根元素應該看起來像這樣:

<rdf:RDF xmlns:PREMIS="info:lc/xmlns/premis-v2" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:xlink="http://www.w3.org/1999/xlink"> 

我已經嘗試了幾件事,我在這裏也發現了一些帖子。但我不明白。有任何想法嗎?謝謝。

後處理XSLT:

<?xml version="1.0"?> 
<!-- sample_2.xsl --> 
<xsl:stylesheet version="2.0" 
exclude-result-prefixes="PREMIS" 
xmlns:PREMIS="info:lc/xmlns/premis-v2" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" 
> 

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="namespace::* except namespace::PREMIS"/> 
     <xsl:namespace name="PREMIS" select="'http://www.loc.gov/premis/rdf/v1#'"/> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="PREMIS:*"> 
    <xsl:element name="PREMIS:{local-name()}" namespace="http://www.loc.gov/premis/rdf/v1#"> 
     <xsl:copy-of select="namespace::* except namespace::PREMIS"/> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template></xsl:stylesheet> 
+0

這是完整的XML?你錯過了一些最終元素。 – NMGod

+0

@NMGod - 這只是代碼格式錯誤。我修好了他們。 –

回答

0

我假設你想要的輸出是一個錯字,而你真正想要的:

<rdf:RDF xmlns:PREMIS="http://www.loc.gov/premis/rdf/v1#" 
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:xlink="http://www.w3.org/1999/xlink"> 
    ... 
</rdf:RDF> 

在你的樣式表,使用相同的前綴PREMIS參考不同的名稱空間取決於你是否正在閱讀或寫作將會非常困難。輸出中的前綴是否必須是PREMIS,還是會有其他前綴?如果它必須是相同的(也許無論如何),我認爲我的首選方法是後處理輸出使用:

<xsl:stylesheet exclude-result-prefixes="PREMIS"...> 

<xsl:template match="*"> 
    <xsl:copy> 
    <xsl:copy-of select="namespace::* except namespace::PREMIS"/> 
    <xsl:namespace name="PREMIS" select="'http://www.loc.gov/premis/rdf/v1#'"/> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="PREMIS:*"> 
    <xsl:element name="PREMIS:{local-name()}" namespace="http://www.loc.gov/premis/rdf/v1#"> 
    <xsl:copy-of select="namespace::* except namespace::PREMIS"/> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
+0

謝謝Michael!是的,更改前綴將是beter方法。無論如何,當我後處理它,因爲你建議我得到一個錯誤的氧氣: Fehlerlevel:fatal Beschreibung:XTDE0430:無法創建兩個名稱空間節點具有相同的前綴映射到不同的URI(前綴= PREMIS,URI = http:// www.loc.gov/premis/rdf/v1#,URI = info:lc/xmlns/premis-v2) Anfang:15:0 URL:http://www.w3.org/TR/xslt20/#err -XTDE0430 我用過的XSLT文件在上面發佈。我理解錯了什麼? – trace72

+0

嘗試將copy-namespaces =「no」添加到xsl; copy元素。 –