选择子元素的值

大卫·奥利弗(David Oliver)

为什么<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=""xmlnsxsl: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

根据相邻子元素值有选择地更新XML子元素值

来自分类Dev

根据父级的属性值选择子级元素

来自分类Dev

根据元素值从列表中选择子列表

来自分类Dev

onclick选择子元素

来自分类Dev

选择子元素

来自分类Dev

选择子元素jQuery

来自分类Dev

选择父元素的子元素

来自分类Dev

选择子元素而不选择父元素

来自分类Dev

使用XSLT / XPATH选择具有特定值的子元素的元素

来自分类Dev

sql查询varchar(max)列以根据其子元素child的值选择一个元素

来自分类Dev

XPath:在其子元素中选择具有特定值的元素

来自分类Dev

使用XSLT / XPATH选择具有特定值的子元素的元素

来自分类Dev

sql查询varchar(max)列以根据其子元素child的值选择一个元素

来自分类Dev

获取选择值的元素

来自分类Dev

取子元素的值

来自分类Dev

在<section>下选择子元素

来自分类Dev

用jQuery选择子元素

来自分类Dev

XPath 选择特定的子元素

来自分类Dev

jQuery-选择元素的子元素的子元素

来自分类Dev

选择元素的所有子元素

来自分类Dev

jQuery选择父元素的子元素

来自分类Dev

迭代父元素并选择子元素

来自分类Dev

xpath用于选择具有在列表中指定的子值的元素

来自分类Dev

IE 11-用户选择的替代值未应用于子元素

来自分类Dev

按子元素查找元素并替换为子元素的值

来自分类Dev

通过名称选择元素的值

来自分类Dev

获取子元素jQuery的值

来自分类Dev

访问Div的子元素值

来自分类Dev

通过选择的值获取选择元素