将常规XML转换为都柏林核心XML时添加命名空间前缀
我很可能遗漏了一些明显的东西,但我不清楚如何编写XSLT样式表,将一个“常规”XML文件转换为在每个元素上包含名称空间“dc”前缀的都柏林核心XML文件。我在这里查阅了很多其他的答案,但似乎不知道如何做到这一点。(我正在使用msxsl.exe进行转换。) 例如,我试图将这一行从我的原始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
<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角落里有一些聪明的人会帮助您解决这个问题。