为什么<xsl:value-of select="p"/>
不产生XML源p
元素的输出?
另外,如何防止xmlns=""
出现在结果的trans-unit
元素上?
谢谢。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd" [
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
]>
<svg>
<variableSets xmlns="&ns_vars;">
<variableSet varSetName="binding1" locked="none">
<variables>
<variable category="&ns_flows;" trait="textcontent" varName="Variable1"></variable>
<variable category="&ns_flows;" trait="textcontent" varName="Variable2"></variable>
<variable category="&ns_flows;" trait="textcontent" varName="Variable3"></variable>
<variable category="&ns_flows;" trait="textcontent" varName="Variable4"></variable>
</variables>
<v:sampleDataSets xmlns:v="&ns_vars;" xmlns="&ns_custom;">
<v:sampleDataSet dataSetName="English">
<Variable1>
<p>Introduction</p>
</Variable1>
<Variable2>
<p>STEP</p>
</Variable2>
<Variable3>
<p>3</p>
</Variable3>
<Variable4>
<p>Anonymous Answer</p>
</Variable4>
</v:sampleDataSet>
</v:sampleDataSets>
</variableSet>
</variableSets>
</svg>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:v = "http://ns.adobe.com/Variables/1.0/"
exclude-result-prefixes="v">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:param name="file"/>
<xsl:param name="source-lang" select="'en-GB'"/>
<xsl:param name="target-lang"/>
<xsl:template match="/">
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file original="{$file}" source-lanuage="{$source-lang}" target-language="{$target-lang}">
<xsl:apply-templates select="//v:sampleDataSet/*"/>
</file>
</xliff>
</xsl:template>
<xsl:template match="//v:sampleDataSet/*">
<trans-unit id="{local-name()}">
<source xml:lang="{$source-lang}"><xsl:value-of select="p"/></source> <!-- no value output -->
<target xml:lang="{$target-lang}"></target>
</trans-unit>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file original="ig-001" source-lanuage="en-GB" target-language="de-DE">
<trans-unit xmlns="" id="Variable1">
<source xml:lang="en-GB"/>
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit xmlns="" id="Variable2"> <!-- unwanted xmlns attribute -->
<source xml:lang="en-GB"/> <!-- output needed here -->
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit xmlns="" id="Variable3">
<source xml:lang="en-GB"/>
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit xmlns="" id="Variable4">
<source xml:lang="en-GB"/>
<target xml:lang="de-DE"/>
</trans-unit>
</file>
</xliff>
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file original="ig-001" source-lanuage="en-GB" target-language="de-DE">
<trans-unit id="Variable1">
<source xml:lang="en-GB">Introduction</source>
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit id="Variable2">
<source xml:lang="en-GB">STEP</source>
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit id="Variable3">
<source xml:lang="en-GB">3</source>
<target xml:lang="de-DE"/>
</trans-unit>
<trans-unit id="Variable4">
<source xml:lang="en-GB">Anonymous Answer</source>
<target xml:lang="de-DE"/>
</trans-unit>
</file>
</xliff>
p
元素值:根据@LarsH的回答,这是一个名称空间问题。我在元素中添加了xmlns:custom = "http://ns.adobe.com/GenericCustomNamespace/1.0/"
声明,xsl:stylesheet
并使用custom:p
代替了p
:
<xsl:value-of select="custom:p"/>
xmlns=""
:xmlns
在xsl:stylesheet
元素上设置属性而不是在根元素上手动设置默认名称空间即可解决此问题。
完整的新XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="urn:oasis:names:tc:xliff:document:1.2"
xmlns:vars = "http://ns.adobe.com/Variables/1.0/"
xmlns:custom = "http://ns.adobe.com/GenericCustomNamespace/1.0/"
exclude-result-prefixes="vars custom">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:param name="file"/>
<xsl:param name="source-lang" select="'en-GB'"/>
<xsl:param name="target-lang"/>
<xsl:template match="/">
<xliff version="1.2">
<file original="{$file}" source-lanuage="{$source-lang}" target-language="{$target-lang}">
<xsl:apply-templates select="//vars:sampleDataSet/*"/>
</file>
</xliff>
</xsl:template>
<xsl:template match="//vars:sampleDataSet/*">
<trans-unit id="{local-name()}">
<source xml:lang="{$source-lang}"><xsl:value-of select="custom:p"/></source>
<target xml:lang="{$target-lang}"></target>
</trans-unit>
</xsl:template>
</xsl:stylesheet>
为什么
<xsl:value-of select="p"/>
不输出XML源的p元素?
在此模板中
<xsl:template match="//v:sampleDataSet/*">
<trans-unit id="{local-name()}">
<source xml:lang="{$source-lang}"><xsl:value-of select="p"/></source>
上下文节点是的任何子节点<v:sampleDataSet>
,例如<Variable1>
。在源XML中,后者<p>
在URI标识的名称空间中具有子元素http://ns.adobe.com/GenericCustomNamespace/1.0/
。这是因为<p>
没有名称空间前缀,所以它使用默认名称空间,该名称空间由具有默认名称空间声明的最接近的祖先建立。这是
<v:sampleDataSets ... xmlns="&ns_custom;">
但是,XSLT要求p
没有名称空间的元素。因此,缺少任何输出。
另外,如何防止xmlns =“”出现在结果的跨单元元素上?
您不必保证名称空间声明将如何出现在序列化输出中。但是,您可以指定每个元素将位于哪个命名空间中。由于您希望<trans-unit>
元素位于oasis命名空间中,因此需要在XSLT中进行指定。并且由于它们在输出XML中已经有一个祖先,并且以oasis名称空间作为默认名称空间,因此它们很可能在没有名称空间前缀和名称空间声明属性的情况下进行序列化。您可以告诉XSLT以<trans-unit>
与对<xliff>
元素相同的方式输出oasis命名空间中的元素:
<trans-unit xmlns="urn:oasis:names:tc:xliff:document:1.2" id="{local-name()}">
这会将您的跨单元元素放入结果XML的正确名称空间中,这对于任何下游处理都是很重要的(目前还不正确)。希望结果XML中的名称空间声明也看起来不错,但这并不能保证。但是,有一些我不记得的有关放置名称空间节点的详细信息,因此也许其他人可以提供更好的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句