0

我看过这个问题,这与我遇到的问题相同: XSL Conversion XML->XML outputs only text?

但是我声明了一个默认命名空间,并且仍未创建标签,我只是得到一个文本块。

这是我的 XSLT 的开始(它很大,所以我不会发布很多)

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml/presentation">

    <xsl:template match="/x">
        <PatientData>
            <xsl:value-of select="x:Patientdata"/>
            <Versionnumber>
                <xsl:value-of select="x:Patientdata/Versionnumber"/>
            </Versionnumber>
            <Patient>
                <xsl:value-of select="x:Patientdata/Patient"/>
                <PatientCharacterstics>
                    <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics"/>
                    <patientCode>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/patientCode"/>
                    </patientCode>
                    <identifier>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/identifier"/>
                    </identifier>
                    <sex>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/sex"/>
                    </sex>
                    <dateOfBirth>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/dateOfBirth"/>
                    </dateOfBirth>
                    <DebutOfSymptoms>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/DebutOfSymptoms"/>
                    </DebutOfSymptoms>

我得到的只是一大块文本作为输出,而不是一个标签。

编辑:根据要求的一些示例输入 XML,它是一个压缩版本来说明,基本上 xslt 只是重新排列 xml 文件元素的顺序:

<Patientdata>
<Versionnumber>1</Versionnumber>
<Patient>
   <PatientCharacteristics>
      <dateOfBirth>1900-01-01</dateOfBirth>
      <patientCode>1</patientCode>
      <DebutOfSymptoms>1935-01-01</DebutOfSymptoms>
      <sex>1</sex>
      <identifier>7705</identifier>
   </PatientCharacteristics>
</Patient>
<Patient>
   <PatientCharacteristics>
      <dateOfBirth>1919-01-01</dateOfBirth>
      <patientCode>3</patientCode>
      <DebutOfSymptoms>1925-01-01</DebutOfSymptoms>
      <sex>2</sex>
      <identifier>7405</identifier>
   </PatientCharacteristics>
</Patient>
</Patientdata>

编辑2:我已将其缩减为裸组件

XSLT:

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml/presentation">

    <xsl:template match="/">
        <PatientData>
            <xsl:value-of select="x:Patientdata"/>
            <Versionnumber>
                <xsl:value-of select="x:Patientdata/x:Versionnumber"/>
            </Versionnumber>
            <Patient>
                <xsl:value-of select="x:Patientdata/x:Patient"/>
                <PatientCharacterstics>
                    <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics"/>
                    <patientCode>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/patientCode"/>
                    </patientCode>
                    <identifier>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/identifier"/>
                    </identifier>
                    <sex>
                        <xsl:value-of select="x:Patientdata/x:Patient/x:PatientCharacteristics/x:sex"/>
                    </sex>
                    <dateOfBirth>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/dateOfBirth"/>
                    </dateOfBirth>
                    <DebutOfSymptoms>
                        <xsl:value-of select="x:Patientdata/Patient/PatientCharacteristics/DebutOfSymptoms"/>
                    </DebutOfSymptoms>

                </PatientCharacterstics>
            </Patient>
        </PatientData>
    </xsl:template>
</xsl:stylesheet>

这是我的 XML

<?xml version="1.0"?>
<Patientdata>
<Versionnumber>1</Versionnumber>
<Patient>
   <PatientCharacteristics>
      <dateOfBirth>1900-01-01</dateOfBirth>
      <patientCode>1</patientCode>
      <DebutOfSymptoms>1935-01-01</DebutOfSymptoms>
      <sex>1</sex>
      <identifier>7705</identifier>
   </PatientCharacteristics>
</Patient>
<Patient>
   <PatientCharacteristics>
      <dateOfBirth>1919-01-01</dateOfBirth>
      <patientCode>3</patientCode>
      <DebutOfSymptoms>1925-01-01</DebutOfSymptoms>
      <sex>2</sex>
      <identifier>7405</identifier>
   </PatientCharacteristics>
</Patient>
</Patientdata>

这是输出:

<?xml version='1.0' ?>
<PatientData xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Versionnumber/>
<Patient>
<PatientCharacterstics>
<patientCode/>
<identifier/>
<sex/>
<dateOfBirth/>
<DebutOfSymptoms/>
</PatientCharacterstics>
</Patient>
</PatientData>

当输出应该是:

<?xml version="1.0"?>
<Patientdata>
<Versionnumber>1</Versionnumber>
<Patient>
   <PatientCharacteristics>
      <patientCode>1</patientCode>
      <identifier>7705</identifier>
      <sex>1</sex>
      <dateOfBirth>1900-01-01</dateOfBirth>
      <DebutOfSymptoms>1935-01-01</DebutOfSymptoms>
   </PatientCharacteristics>
</Patient>
<Patient>
   <PatientCharacteristics>
      <patientCode>3</patientCode>
      <identifier>7405</identifier>
      <dateOfBirth>1919-01-01</dateOfBirth>     
      <sex>2</sex>
      <DebutOfSymptoms>1925-01-01</DebutOfSymptoms>
   </PatientCharacteristics>
</Patient>
</Patientdata>
4

1 回答 1

1

如果您的源 XML 数据具有默认命名空间声明,例如

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

那么你的问题是你的模板试图匹配一个x没有命名空间的元素。你需要开始标签是

<xsl:template match="/x:x">

但是,如果您认为您的模板所做的是应用默认命名空间,并且您的 XML 数据的根元素是Patientdata而不是x,那么您就误会了。您的模板应该只匹配这样的根元素

<xsl:template match="/">

另请注意,您需要在 XPath 表达式中的每一步都使用名称空间前缀,如下所示

<xsl:value-of select="x:Patientdata/x:Patient/x:PatientCharacteristics/x:sex"/>

更新

现在您已经展示了更多数据,我可以更好地理解您想要什么。您声明的默认命名空间、xmlns:x命名空间声明和匹配的模板/x都是红鲱鱼,您似乎根本不需要任何特殊的命名空间。

我想知道您是否对转换产生的输出看的不够远,因为您的转换中有几个元素<xsl:value-of select="x:Patientdata"/>,这些元素是多余的,并导致输入元素的所有文本后代都被复制到输出。其余信息也在那里,但它在页面下方的几行中。

如果我删除x命名空间前缀声明及其用途,以及那些不必要的value-of元素,您的转换工作正常。我还添加了一个output元素来启用输出的缩进,使其看起来不错。

这个

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output indent="yes"/>

  <xsl:template match="/">
    <PatientData>
      <Versionnumber>
        <xsl:value-of select="Patientdata/Versionnumber"/>
      </Versionnumber>
      <Patient>
        <PatientCharacterstics>
          <patientCode>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/patientCode"/>
          </patientCode>
          <identifier>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/identifier"/>
          </identifier>
          <sex>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/sex"/>
          </sex>
          <dateOfBirth>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/dateOfBirth"/>
          </dateOfBirth>
          <DebutOfSymptoms>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/DebutOfSymptoms"/>
          </DebutOfSymptoms>

        </PatientCharacterstics>
      </Patient>
    </PatientData>
  </xsl:template>
</xsl:stylesheet>

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <PatientData>
      <Versionnumber>
        <xsl:value-of select="Patientdata/Versionnumber"/>
      </Versionnumber>
      <Patient>
        <PatientCharacterstics>
          <patientCode>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/patientCode"/>
          </patientCode>
          <identifier>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/identifier"/>
          </identifier>
          <sex>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/sex"/>
          </sex>
          <dateOfBirth>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/dateOfBirth"/>
          </dateOfBirth>
          <DebutOfSymptoms>
            <xsl:value-of select="Patientdata/Patient/PatientCharacteristics/DebutOfSymptoms"/>
          </DebutOfSymptoms>

        </PatientCharacterstics>
      </Patient>
    </PatientData>
  </xsl:template>

</xsl:stylesheet>

产生这个输出

<?xml version="1.0" encoding="utf-8"?>
<PatientData>
   <Versionnumber>1</Versionnumber>
   <Patient>
      <PatientCharacterstics>
         <patientCode>1</patientCode>
         <identifier>7705</identifier>
         <sex>1</sex>
         <dateOfBirth>1900-01-01</dateOfBirth>
         <DebutOfSymptoms>1935-01-01</DebutOfSymptoms>
      </PatientCharacterstics>
   </Patient>
</PatientData>

更新 2

XSLT 确实是一种声明性语言,虽然它有许多过程元素,例如for-eachif,但最好使用模板来定义如何处理源文件。

我意识到你已经减少了变换,我所看到的你正在尝试做的只是对每个PatientCharacterstics元素中的元素重新排序。该模板将为您做到这一点。

第一个模板是通用复制模板,它匹配所有节点并通过复制开始标记、处理任何子节点和复制结束标记来处理它们。第二个模板是与要更改的元素匹配的特殊模板PatientCharacteristics- 通过以相同方式复制标签进行处理,但按所需的特定顺序处理子项。

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="PatientCharacteristics">
    <xsl:copy>
      <xsl:apply-templates select="patientCode"/>
      <xsl:apply-templates select="identifier"/>
      <xsl:apply-templates select="sex"/>
      <xsl:apply-templates select="dateOfBirth"/>
      <xsl:apply-templates select="DebutOfSymptoms"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

输出

<?xml version="1.0" encoding="utf-8"?>
<Patientdata>
   <Versionnumber>1</Versionnumber>
   <Patient>
      <PatientCharacteristics>
         <patientCode>1</patientCode>
         <identifier>7705</identifier>
         <sex>1</sex>
         <dateOfBirth>1900-01-01</dateOfBirth>
         <DebutOfSymptoms>1935-01-01</DebutOfSymptoms>
      </PatientCharacteristics>
   </Patient>
   <Patient>
      <PatientCharacteristics>
         <patientCode>3</patientCode>
         <identifier>7405</identifier>
         <sex>2</sex>
         <dateOfBirth>1919-01-01</dateOfBirth>
         <DebutOfSymptoms>1925-01-01</DebutOfSymptoms>
      </PatientCharacteristics>
   </Patient>
</Patientdata>
于 2013-05-23T18:12:20.363 回答