Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 将XML中字符串的所有实例替换为****_Xslt_Xslt 2.0 - Fatal编程技术网

Xslt 将XML中字符串的所有实例替换为****

Xslt 将XML中字符串的所有实例替换为****,xslt,xslt-2.0,Xslt,Xslt 2.0,我有一个XSL,它需要过滤掉XML中的特定数据 <identifiedPerson classCode="IDENT"> <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" /> <addr use="PHYS"> <

我有一个XSL,它需要过滤掉XML中的特定数据

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
在我的XML中的某个地方会有一个节点,如:

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
下面的XSL删除了扩展节点,并向该节点添加了nullFlavor=“MSK”

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
我现在需要做的是从扩展节点获取值,并在整个XML文档中搜索该值,然后将其替换为**

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
但我不知道如何使用扩展名属性,并在XML中找到该值的所有实例(它们可以隐藏在文本和属性中),然后将它们转换为**(4*)

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
下面的例子只是一个例子。我无法硬编码XSL以查看特定节点,它需要查看xml中的所有文本/属性文本(原因是有5种以上的不同版本的xml将应用于此)

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
我需要在节点中找到扩展,然后从XML的其余部分替换(删除)该值。我正在寻找一个适合所有消息的1解决方案,因此全局搜索->擦除扩展值

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
例如:

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>

坎卢普斯
加利福尼亚州
V1B3C1
卑诗省
1A
2A
9494949494949
4A
应该是(下面的XSLT已经用匹配的OID屏蔽了节点中的扩展)

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>

坎卢普斯
加利福尼亚州
V1B3C1
卑诗省
1A
2A
****
4A
任何帮助都将不胜感激

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
我能够使用XSL2.0

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
我有当前的XSL。它工作正常。它匹配根为“2.16.840.1.113883.3.51.1.1.6.1”的任何标记,删除所有属性并添加nullFlavor=“MSK”。但是,这不会在整个XML中搜索相同的#

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>

MSK
任何帮助都将不胜感激

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>

谢谢,XSLT2.0样式表

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="replacement" select="'****'"/>

  <xsl:param name="new" select="'MKS'"/>

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

  <xsl:template match="identifiedPerson">
    <xsl:copy>
      <xsl:apply-templates select="@* , node()">
        <xsl:with-param name="to-be-replaced" select="id/@extension" tunnel="yes"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="identifiedPerson//text()">
    <xsl:param name="to-be-replaced" tunnel="yes"/>
    <xsl:sequence select="replace(., $to-be-replaced, $replacement)"/>
  </xsl:template>

  <xsl:template match="identifiedPerson//@*">
    <xsl:param name="to-be-replaced" tunnel="yes"/>
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}" select="replace(., $to-be-replaced, $replacement)"/>
  </xsl:template>

  <xsl:template match="identifiedPerson/id">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="nullFlavor" select="$new"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="identifiedPerson/id/@extension"/>

</xsl:stylesheet>

XSLT2.0样式表

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0">

  <xsl:param name="replacement" select="'****'"/>

  <xsl:param name="new" select="'MKS'"/>

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

  <xsl:template match="identifiedPerson">
    <xsl:copy>
      <xsl:apply-templates select="@* , node()">
        <xsl:with-param name="to-be-replaced" select="id/@extension" tunnel="yes"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="identifiedPerson//text()">
    <xsl:param name="to-be-replaced" tunnel="yes"/>
    <xsl:sequence select="replace(., $to-be-replaced, $replacement)"/>
  </xsl:template>

  <xsl:template match="identifiedPerson//@*">
    <xsl:param name="to-be-replaced" tunnel="yes"/>
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}" select="replace(., $to-be-replaced, $replacement)"/>
  </xsl:template>

  <xsl:template match="identifiedPerson/id">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:attribute name="nullFlavor" select="$new"/>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="identifiedPerson/id/@extension"/>

</xsl:stylesheet>

尝试使用变量保存要替换的文本的值。像这样:

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
<xsl:variable
    name="rootVar"
    select="//*[@root = '2.16.840.1.113883.3.51.1.1.6.1']/@extension" />

尝试使用变量保存要替换的文本的值。像这样:

        <identifiedPerson classCode="IDENT">
                <id root="2.16.840.1.113883.3.51.1.1.6.1" extension="9494949494949" displayable="true" />
                <addr use="PHYS">
                    <city>KAMLOOPS</city>
                    <country>CA</country>
                    <postalCode>V1B3C1</postalCode>
                    <state>BC</state>
                    <streetAddressLine>1A</streetAddressLine>
                    <streetAddressLine>2A</streetAddressLine>
                    <streetAddressLine>9494949494949</streetAddressLine>
                    <streetAddressLine>4A</streetAddressLine>                        
                </addr>
                <note text="9494949494949 should be stars"/>
<xsl:variable
    name="rootVar"
    select="//*[@root = '2.16.840.1.113883.3.51.1.1.6.1']/@extension" />

谢谢你的意见。文档格式不是一成不变的,因此我无法硬编码XSL来搜索特定节点。需要检查上述OID(2.16.840.1.113883.3.51.1.1.6.1)中的所有值是否正确。我将为输入更新QuesitionTanks。文档格式不是一成不变的,因此我无法硬编码XSL来搜索特定节点。需要检查上述OID(2.16.840.1.113883.3.51.1.1.6.1)中的所有值是否正确。我将更新QuesitionWorks,以便在文本中查找和替换。属性会发生什么情况?将模板更改为match/@*| text(),效果非常好!嗯,似乎我在match=“/@*| text()”中添加的更新删除了所有属性,并将值放入实际的xml节点中。在文本中查找和替换效果很好。属性会发生什么情况?将模板更改为match/@*| text(),效果非常好!嗯,似乎我在match=“/@*| text()”中输入的更新删除了所有属性,并将值放入实际的xml节点中。