将常规XML转换为都柏林核心XML时添加命名空间前缀

将常规XML转换为都柏林核心XML时添加命名空间前缀,xml,xslt,namespaces,xslt-1.0,Xml,Xslt,Namespaces,Xslt 1.0,我很可能遗漏了一些明显的东西,但我不清楚如何编写XSLT样式表,将一个“常规”XML文件转换为在每个元素上包含名称空间“dc”前缀的都柏林核心XML文件。我在这里查阅了很多其他的答案,但似乎不知道如何做到这一点。(我正在使用msxsl.exe进行转换。) 例如,我试图将这一行从我的原始XML文档改为: <title>Message received clairaudiently by Mrs. Begg at Lake Pleasant, Fri. March 9, 1945

我很可能遗漏了一些明显的东西,但我不清楚如何编写XSLT样式表,将一个“常规”XML文件转换为在每个元素上包含名称空间“dc”前缀的都柏林核心XML文件。我在这里查阅了很多其他的答案,但似乎不知道如何做到这一点。(我正在使用msxsl.exe进行转换。)

例如,我试图将这一行从我的原始XML文档改为:

    <title>Message received clairaudiently by Mrs. Begg at Lake Pleasant, Fri. March 9, 1945.</title>
周五,贝格夫人在普莱森特湖敏锐地收到了这条信息。1945年3月9日。
…在通过XSLT转换运行之后:

周五,贝格夫人在普莱森特湖敏锐地收到了这条信息。1945年3月9日。
下面是我在XSL文件中使用的样式表元素:

    <xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xlink="http://:www.w3.org/1999/xlink" 
    xmlns:dc="http://purl.org/dc/elements/1.1/">

所以我的问题是,我是否必须将“dc:”前缀硬编码到XSL样式表中的各个元素中,即la:

<dc:title><xsl:value-of select="title" /></dc:title>

或者有没有办法让XSL转换自动为每个元素添加前缀

[一] 有没有办法让XSL转换自动为每个元素添加前缀

如果要为所有元素添加前缀而不添加异常,则不必手动添加前缀。例如,如果您有如下输入文件:

输入

<?xml version="1.0"?>
<root>
    <item/>
    <item/>
</root>
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://purl.org/dc/elements/1.1/">

   <xsl:output method="xml" indent="yes"/>
   <xsl:strip-space elements="*"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="*">
       <xsl:element name="{concat('dc:',name())}">
           <xsl:apply-templates select="@*|node()"/>
       </xsl:element>
   </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<dc:root xmlns:dc="http://purl.org/dc/elements/1.1/">
   <dc:item/>
   <dc:item/>
</dc:root>
输出

<?xml version="1.0"?>
<root>
    <item/>
    <item/>
</root>
<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:dc="http://purl.org/dc/elements/1.1/">

   <xsl:output method="xml" indent="yes"/>
   <xsl:strip-space elements="*"/>

   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>

   <xsl:template match="*">
       <xsl:element name="{concat('dc:',name())}">
           <xsl:apply-templates select="@*|node()"/>
       </xsl:element>
   </xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="utf-8"?>
<dc:root xmlns:dc="http://purl.org/dc/elements/1.1/">
   <dc:item/>
   <dc:item/>
</dc:root>


请注意,无法判断是否可以将其集成到当前的样式表中。不幸的是,您没有透露太多内容。

因此,您希望做的唯一更改是在所有元素前面加上
dc:
?谢谢您的回答!在某种程度上,它确实回答了我的问题——这个解决方案似乎比我预期的这个任务要复杂得多。我试图根据一个非常简单的DC RNG验证我的结果XML文件。我会回到它,看看我能做什么,如果我有更多的问题,我会重新张贴整个代码在这里。再次感谢@用户3415610不客气。如果你有其他问题,如果我理解正确的话,最好打开一个新问题。如果有帮助的话,请考虑接受答案(标记左边的蜱虫)。谢谢!最后,我有点不好意思地说,原来我甚至不需要前缀。DC XML文件未验证的原因是,我正在验证它的RNG需要一个特定的元素顺序,而我没有使用该顺序。我从Jing那里收到的错误消息太神秘了,我花了一段时间才弄明白。@user3415610不用担心,不客气。但下一次,您可以立即包含隐藏的错误消息。从您面临的问题开始总是比从您尝试的解决方案开始要好——在这里的XML角落里有一些聪明的人会帮助您解决这个问题。