2017-04-13 44 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元素。 –