选择子元素的值

Selecting value of child element

为什么 <xsl:value-of select="p"/> 没有导致 XML 源的 p 元素的输出?

此外,如何防止 xmlns="" 出现在结果的 trans-unit 元素上?

谢谢。

来源XML

<?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>

XSLT

<?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="":在 xsl:stylesheet 元素上使用 xmlns 属性设置默认命名空间,而不是在根元素上手动处理此问题。

完整的新 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>

Why is <xsl:value-of select="p"/> not resulting in the output of the XML source’s p element?

在此模板中

<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 中,后者在 URI http://ns.adobe.com/GenericCustomNamespace/1.0/ 标识的命名空间中有 <p> 个元素子级。这是因为 <p> 没有命名空间前缀,所以它使用默认命名空间,默认命名空间是由最近的具有默认命名空间声明的祖先建立的。这是

<v:sampleDataSets  ... xmlns="&ns_custom;">

然而,XSLT 要求 p 没有名称空间的元素。因此缺少任何输出。

Also, how can I prevent xmlns="" from appearing on the result’s trans-unit elements?

您不一定能保证命名空间声明将如何出现在序列化输出中。但是,您可以指定每个元素所在的名称空间。由于您希望 <trans-unit> 元素位于 oasis 名称空间中,因此需要在 XSLT 中指定;并且由于它们在输出 XML 中已经有一个祖先,该祖先将 oasis 命名空间作为默认命名空间,因此它们很可能在没有命名空间前缀和命名空间声明属性的情况下进行序列化。您可以告诉 XSLT 在 oasis 命名空间中输出 <trans-unit> 元素,就像您对 <xliff> 元素所做的那样:

   <trans-unit xmlns="urn:oasis:names:tc:xliff:document:1.2" id="{local-name()}">

这会将您的跨单元元素放入结果 XML 中的正确命名空间中,这对于任何下游处理都是重要的(目前不正确)。希望结果 XML 中的名称空间声明也看起来不错,但这并不能真正保证。但是,关于放置命名空间节点的细节我不记得了,所以也许其他人可以给出更好的答案。