选择子元素的值

时间:2015-08-07 20:53:37

标签: xml xslt xslt-1.0

为什么<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="":在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>

1 个答案:

答案 0 :(得分:0)

  

为什么<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>标识的名称空间中的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>元素相同的方式输出oasis命名空间中的<xliff>元素:

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

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

相关问题